From ceeba486555763689b0d516b1087e70ea880fa8d Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Fri, 7 Jul 2023 19:37:43 +0900 Subject: [PATCH 01/36] st-device-app: Add st-device-app for automation test with Android device Signed-off-by: Jaehoon You Signed-off-by: chulspro.kim@samsung.com --- examples/st-device-app/android/.gn | 25 + examples/st-device-app/android/App/.gitignore | 27 + .../st-device-app/android/App/app/.gitignore | 2 + .../android/App/app/build.gradle.kts | 95 + .../android/App/app/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.kt | 24 + .../App/app/src/main/AndroidManifest.xml | 31 + .../app/src/main/ic_launcher-playstore.png | Bin 0 -> 41296 bytes .../com/samsung/matter/chipstdeviceapp/App.kt | 15 + .../matter/chipstdeviceapp/MainActivity.kt | 70 + .../matter/chipstdeviceapp/TimberDebugTree.kt | 13 + .../res/drawable/ic_launcher_background.xml | 74 + .../res/drawable/ic_launcher_foreground.xml | 31 + .../app/src/main/res/layout/activity_main.xml | 30 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3735 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5523 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2689 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3472 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5164 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7893 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 8263 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 12604 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 11238 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 17524 bytes .../app/src/main/res/navigation/nav_graph.xml | 10 + .../app/src/main/res/values-night/colors.xml | 5 + .../App/app/src/main/res/values/strings.xml | 3 + .../matter/chipstdeviceapp/ExampleUnitTest.kt | 17 + .../android/App/build.gradle.kts | 21 + .../android/App/buildSrc/.gitignore | 1 + .../android/App/buildSrc/build.gradle.kts | 7 + .../main/java/com/samsung/buildsrc/Deps.kt | 49 + .../java/com/samsung/buildsrc/Versions.kt | 8 + .../android/App/core/common/.gitignore | 1 + .../android/App/core/common/build.gradle.kts | 60 + .../App/core/common/consumer-rules.pro | 0 .../App/core/common/proguard-rules.pro | 21 + .../core/common/ExampleInstrumentedTest.kt | 22 + .../core/common/src/main/AndroidManifest.xml | 4 + .../chipstdeviceapp/core/common/DeepLink.kt | 18 + .../chipstdeviceapp/core/common/Device.kt | 43 + .../core/common/MatterConstants.kt | 11 + .../core/common/MatterSettings.kt | 11 + .../chipstdeviceapp/core/common/QrcodeUtil.kt | 29 + .../chipstdeviceapp/core/common/Result.kt | 18 + .../core/common/di/CoroutinesModule.kt | 33 + .../core/common/di/CoroutinesQualifiers.kt | 19 + .../common/ui/DisableAppBarLayoutBehavior.kt | 33 + .../res/drawable-hdpi/smartthings_icon.png | Bin 0 -> 21996 bytes .../res/drawable-mdpi/smartthings_icon.png | Bin 0 -> 13686 bytes .../drawable-night-hdpi/smartthings_icon.png | Bin 0 -> 21343 bytes .../drawable-night-mdpi/smartthings_icon.png | Bin 0 -> 13311 bytes .../drawable-night-xhdpi/smartthings_icon.png | Bin 0 -> 29998 bytes .../smartthings_icon.png | Bin 0 -> 45721 bytes .../smartthings_icon.png | Bin 0 -> 61217 bytes .../res/drawable-night/smartthings_icon.png | Bin 0 -> 9513 bytes .../res/drawable-xhdpi/smartthings_icon.png | Bin 0 -> 30892 bytes .../res/drawable-xxhdpi/smartthings_icon.png | Bin 0 -> 46956 bytes .../res/drawable-xxxhdpi/smartthings_icon.png | Bin 0 -> 63074 bytes .../src/main/res/drawable/menu_item_bg.xml | 6 + .../res/drawable/round_device_unknown_24.xml | 5 + .../main/res/drawable/round_toggle_on_24.xml | 5 + .../main/res/drawable/smartthings_icon.png | Bin 0 -> 9814 bytes .../src/main/res/values-night/colors.xml | 5 + .../common/src/main/res/values/colors.xml | 12 + .../common/src/main/res/values/dimens.xml | 25 + .../common/src/main/res/values/strings.xml | 6 + .../common/src/main/res/values/themes.xml | 27 + .../core/common/ExampleUnitTest.kt | 17 + .../android/App/core/data/.gitignore | 1 + .../android/App/core/data/build.gradle.kts | 55 + .../android/App/core/data/consumer-rules.pro | 0 .../android/App/core/data/proguard-rules.pro | 21 + .../core/data/ExampleInstrumentedTest.kt | 24 + .../core/data/src/main/AndroidManifest.xml | 4 + .../core/data/di/DataModule.kt | 22 + .../core/data/repository/MatterRepository.kt | 8 + .../data/repository/MatterRepositoryImpl.kt | 18 + .../core/data/repository/NetworkRepository.kt | 5 + .../data/repository/NetworkRepositoryImpl.kt | 33 + .../core/data/ExampleUnitTest.kt | 17 + .../android/App/core/domain/.gitignore | 1 + .../android/App/core/domain/build.gradle.kts | 52 + .../App/core/domain/consumer-rules.pro | 0 .../App/core/domain/proguard-rules.pro | 21 + .../core/domain/ExampleInstrumentedTest.kt | 24 + .../core/domain/src/main/AndroidManifest.xml | 4 + .../core/domain/CoroutineUseCase.kt | 23 + .../core/domain/NonParamCoroutineUseCase.kt | 23 + .../GetManualPairingCodeStringUseCase.kt | 18 + .../usecase/matter/GetQrCodeStringUseCase.kt | 18 + .../domain/usecase/network/GetSSIDUseCase.kt | 17 + .../core/domain/ExampleUnitTest.kt | 17 + .../android/App/core/matter/.gitignore | 1 + .../android/App/core/matter/build.gradle.kts | 60 + .../App/core/matter/consumer-rules.pro | 0 .../App/core/matter/proguard-rules.pro | 21 + .../core/matter/ExampleInstrumentedTest.kt | 24 + .../core/matter/src/main/AndroidManifest.xml | 4 + .../chipstdeviceapp/core/matter/MatterApi.kt | 40 + .../core/matter/model/Payload.kt | 33 + .../core/matter/ExampleUnitTest.kt | 17 + .../android/App/core/model/.gitignore | 1 + .../android/App/core/model/build.gradle.kts | 44 + .../android/App/core/model/consumer-rules.pro | 0 .../android/App/core/model/proguard-rules.pro | 21 + .../core/model/ExampleInstrumentedTest.kt | 24 + .../core/model/src/main/AndroidManifest.xml | 4 + .../core/model/OnobardingType.kt | 12 + .../chipstdeviceapp/core/model/Payload.kt | 7 + .../core/model/ExampleUnitTest.kt | 17 + .../android/App/feature/main/.gitignore | 1 + .../android/App/feature/main/build.gradle.kts | 69 + .../App/feature/main/consumer-rules.pro | 0 .../App/feature/main/proguard-rules.pro | 21 + .../feature/main/ExampleInstrumentedTest.kt | 24 + .../feature/main/src/main/AndroidManifest.xml | 4 + .../feature/main/model/Menu.kt | 19 + .../feature/main/ui/MainFragment.kt | 126 + .../feature/main/ui/adapter/MenuAdapter.kt | 35 + .../main/ui/adapter/ViewBindingAdapter.kt | 10 + .../ui/recyclerview/DataBindingViewHolder.kt | 15 + .../main/ui/recyclerview/ItemDiffCallback.kt | 14 + .../ui/recyclerview/ListBindingAdapter.kt | 26 + .../VerticalSpaceItemDecoration.kt | 27 + .../src/main/res/layout/fragment_main.xml | 115 + .../main/src/main/res/layout/item_menu.xml | 61 + .../main/res/navigation/main_nav_graph.xml | 13 + .../main/src/main/res/values/strings.xml | 4 + .../feature/main/ExampleUnitTest.kt | 17 + .../android/App/feature/qrcode/.gitignore | 1 + .../App/feature/qrcode/build.gradle.kts | 69 + .../App/feature/qrcode/consumer-rules.pro | 0 .../App/feature/qrcode/proguard-rules.pro | 21 + .../feature/qrcode/ExampleInstrumentedTest.kt | 27 + .../qrcode/src/main/AndroidManifest.xml | 4 + .../feature/qrcode/QrcodeFragment.kt | 159 + .../feature/qrcode/QrcodeViewModel.kt | 61 + .../src/main/res/layout/fragment_qrcode.xml | 266 + .../main/res/navigation/qrcode_nav_graph.xml | 18 + .../qrcode/src/main/res/values/strings.xml | 13 + .../feature/qrcode/ExampleUnitTest.kt | 17 + .../android/App/feature/setup/.gitignore | 1 + .../App/feature/setup/build.gradle.kts | 69 + .../App/feature/setup/consumer-rules.pro | 0 .../App/feature/setup/proguard-rules.pro | 21 + .../feature/setup/ExampleInstrumentedTest.kt | 27 + .../setup/src/main/AndroidManifest.xml | 4 + .../feature/setup/SetupFragment.kt | 170 + .../feature/setup/SetupViewModel.kt | 31 + .../setup/src/main/res/drawable/dialog_bg.xml | 9 + .../round_notification_important_24.xml | 5 + .../main/res/layout/dialog_setup_continue.xml | 138 + .../src/main/res/layout/fragment_setup.xml | 291 + .../main/res/navigation/setup_nav_graph.xml | 18 + .../setup/src/main/res/values-ko/strings.xml | 8 + .../src/main/res/values-night/colors.xml | 5 + .../setup/src/main/res/values/colors.xml | 6 + .../setup/src/main/res/values/strings.xml | 18 + .../feature/setup/ExampleUnitTest.kt | 17 + .../android/App/gradle.properties | 28 + .../gradle/wrapper/gradle-wrapper.properties | 7 + examples/st-device-app/android/App/gradlew | 185 + .../st-device-app/android/App/gradlew.bat | 89 + .../android/App/settings.gradle.kts | 24 + examples/st-device-app/android/BUILD.gn | 92 + examples/st-device-app/android/README.md | 63 + examples/st-device-app/android/args.gni | 29 + .../st-device-app/android/build_overrides | 1 + .../st-device-app/android/java/AppImpl.cpp | 103 + examples/st-device-app/android/java/AppImpl.h | 23 + .../android/java/ClusterChangeAttribute.cpp | 56 + .../android/java/JNIDACProvider.cpp | 172 + .../android/java/JNIDACProvider.h | 43 + .../android/java/OnOffManager.cpp | 129 + .../st-device-app/android/java/OnOffManager.h | 45 + .../android/java/StDeviceApp-JNI.cpp | 159 + .../android/java/StDeviceApp-JNI.h | 42 + .../matter/stdeviceapp/DACProvider.java | 32 + .../matter/stdeviceapp/OnOffManager.java | 12 + .../matter/stdeviceapp/StDeviceApp.java | 62 + .../stdeviceapp/StDeviceAppCallback.java | 22 + .../android/third_party/connectedhomeip | 1 + .../st-device-app/st-device-common/BUILD.gn | 25 + .../include/CHIPProjectAppConfig.h | 67 + .../st-device-common/st-device-app.matter | 2211 +++ .../st-device-common/st-device-app.zap | 15593 ++++++++++++++++ scripts/build/build/targets.py | 1 + scripts/build/builders/android.py | 90 +- 191 files changed, 23263 insertions(+), 14 deletions(-) create mode 100644 examples/st-device-app/android/.gn create mode 100644 examples/st-device-app/android/App/.gitignore create mode 100644 examples/st-device-app/android/App/app/.gitignore create mode 100644 examples/st-device-app/android/App/app/build.gradle.kts create mode 100644 examples/st-device-app/android/App/app/proguard-rules.pro create mode 100644 examples/st-device-app/android/App/app/src/androidTest/java/com/samsung/matter/chipstdeviceapp/ExampleInstrumentedTest.kt create mode 100644 examples/st-device-app/android/App/app/src/main/AndroidManifest.xml create mode 100644 examples/st-device-app/android/App/app/src/main/ic_launcher-playstore.png create mode 100644 examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/App.kt create mode 100644 examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/MainActivity.kt create mode 100644 examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/TimberDebugTree.kt create mode 100644 examples/st-device-app/android/App/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 examples/st-device-app/android/App/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 examples/st-device-app/android/App/app/src/main/res/layout/activity_main.xml create mode 100644 examples/st-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 examples/st-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 examples/st-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 examples/st-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 examples/st-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 examples/st-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 examples/st-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 examples/st-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 examples/st-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 examples/st-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 examples/st-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 examples/st-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 examples/st-device-app/android/App/app/src/main/res/navigation/nav_graph.xml create mode 100644 examples/st-device-app/android/App/app/src/main/res/values-night/colors.xml create mode 100644 examples/st-device-app/android/App/app/src/main/res/values/strings.xml create mode 100644 examples/st-device-app/android/App/app/src/test/java/com/samsung/matter/chipstdeviceapp/ExampleUnitTest.kt create mode 100644 examples/st-device-app/android/App/build.gradle.kts create mode 100644 examples/st-device-app/android/App/buildSrc/.gitignore create mode 100644 examples/st-device-app/android/App/buildSrc/build.gradle.kts create mode 100644 examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Deps.kt create mode 100644 examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Versions.kt create mode 100644 examples/st-device-app/android/App/core/common/.gitignore create mode 100644 examples/st-device-app/android/App/core/common/build.gradle.kts create mode 100644 examples/st-device-app/android/App/core/common/consumer-rules.pro create mode 100644 examples/st-device-app/android/App/core/common/proguard-rules.pro create mode 100644 examples/st-device-app/android/App/core/common/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleInstrumentedTest.kt create mode 100644 examples/st-device-app/android/App/core/common/src/main/AndroidManifest.xml create mode 100644 examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/DeepLink.kt create mode 100644 examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Device.kt create mode 100644 examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterConstants.kt create mode 100644 examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterSettings.kt create mode 100644 examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/QrcodeUtil.kt create mode 100644 examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Result.kt create mode 100644 examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesModule.kt create mode 100644 examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesQualifiers.kt create mode 100644 examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/ui/DisableAppBarLayoutBehavior.kt create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-hdpi/smartthings_icon.png create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-mdpi/smartthings_icon.png create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-night-hdpi/smartthings_icon.png create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-night-mdpi/smartthings_icon.png create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xhdpi/smartthings_icon.png create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xxhdpi/smartthings_icon.png create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xxxhdpi/smartthings_icon.png create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-night/smartthings_icon.png create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-xhdpi/smartthings_icon.png create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-xxhdpi/smartthings_icon.png create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-xxxhdpi/smartthings_icon.png create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable/menu_item_bg.xml create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable/round_device_unknown_24.xml create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable/round_toggle_on_24.xml create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable/smartthings_icon.png create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/values-night/colors.xml create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/values/colors.xml create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/values/dimens.xml create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/values/strings.xml create mode 100644 examples/st-device-app/android/App/core/common/src/main/res/values/themes.xml create mode 100644 examples/st-device-app/android/App/core/common/src/test/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleUnitTest.kt create mode 100644 examples/st-device-app/android/App/core/data/.gitignore create mode 100644 examples/st-device-app/android/App/core/data/build.gradle.kts create mode 100644 examples/st-device-app/android/App/core/data/consumer-rules.pro create mode 100644 examples/st-device-app/android/App/core/data/proguard-rules.pro create mode 100644 examples/st-device-app/android/App/core/data/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleInstrumentedTest.kt create mode 100644 examples/st-device-app/android/App/core/data/src/main/AndroidManifest.xml create mode 100644 examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/di/DataModule.kt create mode 100644 examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepository.kt create mode 100644 examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepositoryImpl.kt create mode 100644 examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepository.kt create mode 100644 examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepositoryImpl.kt create mode 100644 examples/st-device-app/android/App/core/data/src/test/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleUnitTest.kt create mode 100644 examples/st-device-app/android/App/core/domain/.gitignore create mode 100644 examples/st-device-app/android/App/core/domain/build.gradle.kts create mode 100644 examples/st-device-app/android/App/core/domain/consumer-rules.pro create mode 100644 examples/st-device-app/android/App/core/domain/proguard-rules.pro create mode 100644 examples/st-device-app/android/App/core/domain/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleInstrumentedTest.kt create mode 100644 examples/st-device-app/android/App/core/domain/src/main/AndroidManifest.xml create mode 100644 examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/CoroutineUseCase.kt create mode 100644 examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/NonParamCoroutineUseCase.kt create mode 100644 examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt create mode 100644 examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetQrCodeStringUseCase.kt create mode 100644 examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/network/GetSSIDUseCase.kt create mode 100644 examples/st-device-app/android/App/core/domain/src/test/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleUnitTest.kt create mode 100644 examples/st-device-app/android/App/core/matter/.gitignore create mode 100644 examples/st-device-app/android/App/core/matter/build.gradle.kts create mode 100644 examples/st-device-app/android/App/core/matter/consumer-rules.pro create mode 100644 examples/st-device-app/android/App/core/matter/proguard-rules.pro create mode 100644 examples/st-device-app/android/App/core/matter/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleInstrumentedTest.kt create mode 100644 examples/st-device-app/android/App/core/matter/src/main/AndroidManifest.xml create mode 100644 examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/MatterApi.kt create mode 100644 examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/model/Payload.kt create mode 100644 examples/st-device-app/android/App/core/matter/src/test/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleUnitTest.kt create mode 100644 examples/st-device-app/android/App/core/model/.gitignore create mode 100644 examples/st-device-app/android/App/core/model/build.gradle.kts create mode 100644 examples/st-device-app/android/App/core/model/consumer-rules.pro create mode 100644 examples/st-device-app/android/App/core/model/proguard-rules.pro create mode 100644 examples/st-device-app/android/App/core/model/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleInstrumentedTest.kt create mode 100644 examples/st-device-app/android/App/core/model/src/main/AndroidManifest.xml create mode 100644 examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/OnobardingType.kt create mode 100644 examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/Payload.kt create mode 100644 examples/st-device-app/android/App/core/model/src/test/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleUnitTest.kt create mode 100644 examples/st-device-app/android/App/feature/main/.gitignore create mode 100644 examples/st-device-app/android/App/feature/main/build.gradle.kts create mode 100644 examples/st-device-app/android/App/feature/main/consumer-rules.pro create mode 100644 examples/st-device-app/android/App/feature/main/proguard-rules.pro create mode 100644 examples/st-device-app/android/App/feature/main/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleInstrumentedTest.kt create mode 100644 examples/st-device-app/android/App/feature/main/src/main/AndroidManifest.xml create mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/model/Menu.kt create mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/MainFragment.kt create mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/MenuAdapter.kt create mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/ViewBindingAdapter.kt create mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/DataBindingViewHolder.kt create mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ItemDiffCallback.kt create mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ListBindingAdapter.kt create mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/VerticalSpaceItemDecoration.kt create mode 100644 examples/st-device-app/android/App/feature/main/src/main/res/layout/fragment_main.xml create mode 100644 examples/st-device-app/android/App/feature/main/src/main/res/layout/item_menu.xml create mode 100644 examples/st-device-app/android/App/feature/main/src/main/res/navigation/main_nav_graph.xml create mode 100644 examples/st-device-app/android/App/feature/main/src/main/res/values/strings.xml create mode 100644 examples/st-device-app/android/App/feature/main/src/test/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleUnitTest.kt create mode 100644 examples/st-device-app/android/App/feature/qrcode/.gitignore create mode 100644 examples/st-device-app/android/App/feature/qrcode/build.gradle.kts create mode 100644 examples/st-device-app/android/App/feature/qrcode/consumer-rules.pro create mode 100644 examples/st-device-app/android/App/feature/qrcode/proguard-rules.pro create mode 100644 examples/st-device-app/android/App/feature/qrcode/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleInstrumentedTest.kt create mode 100644 examples/st-device-app/android/App/feature/qrcode/src/main/AndroidManifest.xml create mode 100644 examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt create mode 100644 examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeViewModel.kt create mode 100644 examples/st-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml create mode 100644 examples/st-device-app/android/App/feature/qrcode/src/main/res/navigation/qrcode_nav_graph.xml create mode 100644 examples/st-device-app/android/App/feature/qrcode/src/main/res/values/strings.xml create mode 100644 examples/st-device-app/android/App/feature/qrcode/src/test/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleUnitTest.kt create mode 100644 examples/st-device-app/android/App/feature/setup/.gitignore create mode 100644 examples/st-device-app/android/App/feature/setup/build.gradle.kts create mode 100644 examples/st-device-app/android/App/feature/setup/consumer-rules.pro create mode 100644 examples/st-device-app/android/App/feature/setup/proguard-rules.pro create mode 100644 examples/st-device-app/android/App/feature/setup/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleInstrumentedTest.kt create mode 100644 examples/st-device-app/android/App/feature/setup/src/main/AndroidManifest.xml create mode 100644 examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupFragment.kt create mode 100644 examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupViewModel.kt create mode 100644 examples/st-device-app/android/App/feature/setup/src/main/res/drawable/dialog_bg.xml create mode 100644 examples/st-device-app/android/App/feature/setup/src/main/res/drawable/round_notification_important_24.xml create mode 100644 examples/st-device-app/android/App/feature/setup/src/main/res/layout/dialog_setup_continue.xml create mode 100644 examples/st-device-app/android/App/feature/setup/src/main/res/layout/fragment_setup.xml create mode 100644 examples/st-device-app/android/App/feature/setup/src/main/res/navigation/setup_nav_graph.xml create mode 100644 examples/st-device-app/android/App/feature/setup/src/main/res/values-ko/strings.xml create mode 100644 examples/st-device-app/android/App/feature/setup/src/main/res/values-night/colors.xml create mode 100644 examples/st-device-app/android/App/feature/setup/src/main/res/values/colors.xml create mode 100644 examples/st-device-app/android/App/feature/setup/src/main/res/values/strings.xml create mode 100644 examples/st-device-app/android/App/feature/setup/src/test/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleUnitTest.kt create mode 100644 examples/st-device-app/android/App/gradle.properties create mode 100644 examples/st-device-app/android/App/gradle/wrapper/gradle-wrapper.properties create mode 100755 examples/st-device-app/android/App/gradlew create mode 100644 examples/st-device-app/android/App/gradlew.bat create mode 100644 examples/st-device-app/android/App/settings.gradle.kts create mode 100644 examples/st-device-app/android/BUILD.gn create mode 100644 examples/st-device-app/android/README.md create mode 100644 examples/st-device-app/android/args.gni create mode 120000 examples/st-device-app/android/build_overrides create mode 100644 examples/st-device-app/android/java/AppImpl.cpp create mode 100644 examples/st-device-app/android/java/AppImpl.h create mode 100644 examples/st-device-app/android/java/ClusterChangeAttribute.cpp create mode 100644 examples/st-device-app/android/java/JNIDACProvider.cpp create mode 100644 examples/st-device-app/android/java/JNIDACProvider.h create mode 100644 examples/st-device-app/android/java/OnOffManager.cpp create mode 100644 examples/st-device-app/android/java/OnOffManager.h create mode 100644 examples/st-device-app/android/java/StDeviceApp-JNI.cpp create mode 100644 examples/st-device-app/android/java/StDeviceApp-JNI.h create mode 100644 examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/DACProvider.java create mode 100644 examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/OnOffManager.java create mode 100644 examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java create mode 100644 examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java create mode 120000 examples/st-device-app/android/third_party/connectedhomeip create mode 100644 examples/st-device-app/st-device-common/BUILD.gn create mode 100644 examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h create mode 100644 examples/st-device-app/st-device-common/st-device-app.matter create mode 100644 examples/st-device-app/st-device-common/st-device-app.zap diff --git a/examples/st-device-app/android/.gn b/examples/st-device-app/android/.gn new file mode 100644 index 00000000000000..5cd171abcda9ff --- /dev/null +++ b/examples/st-device-app/android/.gn @@ -0,0 +1,25 @@ +# Copyright (c) 2020-2022 Project CHIP Authors +# +# 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("//build_overrides/build.gni") + +# The location of the build configuration file. +buildconfig = "${build_root}/config/BUILDCONFIG.gn" + +# CHIP uses angle bracket includes. +check_system_includes = true + +default_args = { + import("//args.gni") +} diff --git a/examples/st-device-app/android/App/.gitignore b/examples/st-device-app/android/App/.gitignore new file mode 100644 index 00000000000000..ee24b62c6a6eb0 --- /dev/null +++ b/examples/st-device-app/android/App/.gitignore @@ -0,0 +1,27 @@ +*.iml +.gradle +/local.properties +/.idea/misc.xml +/.idea/gradle.xml +/.idea/compiler.xml +/.idea/.name +/.idea/jarRepositories.xml +/.idea/vcs.xml +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.idea/** +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties + +# Shared libs & JAR libs (those libs are copied into source tree for easy Android build). +*.so +*.jar +*.map diff --git a/examples/st-device-app/android/App/app/.gitignore b/examples/st-device-app/android/App/app/.gitignore new file mode 100644 index 00000000000000..6f8a813f48dc4c --- /dev/null +++ b/examples/st-device-app/android/App/app/.gitignore @@ -0,0 +1,2 @@ +/build +/.idea \ No newline at end of file diff --git a/examples/st-device-app/android/App/app/build.gradle.kts b/examples/st-device-app/android/App/app/build.gradle.kts new file mode 100644 index 00000000000000..f92023a82b9b66 --- /dev/null +++ b/examples/st-device-app/android/App/app/build.gradle.kts @@ -0,0 +1,95 @@ +import com.samsung.buildsrc.Deps +import com.samsung.buildsrc.Versions + +plugins { + id("com.android.application") + id("kotlin-android") + id("dagger.hilt.android.plugin") + id("androidx.navigation.safeargs.kotlin") + kotlin("kapt") +} + +android { + namespace = "com.samsung.matter.chipstdeviceapp" + compileSdk = Versions.compileSdkVersion + buildToolsVersion = Versions.buildToolsVersion + + defaultConfig { + applicationId = "com.samsung.matter.chipstdeviceapp" + minSdk = Versions.minSdkVersion + targetSdk = Versions.targetSdkVersion + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + externalNativeBuild { + cmake { + targets += listOf("default") + } + } + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + + debug { + packagingOptions { + jniLibs.keepDebugSymbols.add("**/*.so") + } + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + viewBinding = true + dataBinding = true + } + kapt { + correctErrorTypes = true + } + sourceSets { + getByName("main") { + jniLibs.setSrcDirs(listOf("libs/jniLibs")) + } + } + packagingOptions { + jniLibs.pickFirsts.add("**/*.so") + jniLibs.useLegacyPackaging = true + } +} + +dependencies { + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) + + implementation(project(":core:common")) + implementation(project(":core:data")) + implementation(project(":core:domain")) + implementation(project(":core:model")) + implementation(project(":feature:main")) + implementation(project(":feature:qrcode")) + implementation(project(":feature:setup")) + + implementation(Deps.AndroidX.core) + implementation(Deps.AndroidX.appcompat) + implementation(Deps.material) + + implementation(Deps.Dagger.hiltAndroid) + kapt(Deps.Dagger.hiltAndroidCompiler) + + implementation(Deps.timber) + + testImplementation(Deps.Test.junit) + androidTestImplementation(Deps.Test.junitExt) + androidTestImplementation(Deps.Test.espresso) +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/app/proguard-rules.pro b/examples/st-device-app/android/App/app/proguard-rules.pro new file mode 100644 index 00000000000000..481bb434814107 --- /dev/null +++ b/examples/st-device-app/android/App/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/examples/st-device-app/android/App/app/src/androidTest/java/com/samsung/matter/chipstdeviceapp/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/app/src/androidTest/java/com/samsung/matter/chipstdeviceapp/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..19fd38b33d2531 --- /dev/null +++ b/examples/st-device-app/android/App/app/src/androidTest/java/com/samsung/matter/chipstdeviceapp/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.samsung.matter.chipstdeviceapp + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp", appContext.packageName) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/app/src/main/AndroidManifest.xml b/examples/st-device-app/android/App/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000000..0b737dc55c1502 --- /dev/null +++ b/examples/st-device-app/android/App/app/src/main/AndroidManifest.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/app/src/main/ic_launcher-playstore.png b/examples/st-device-app/android/App/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..55c35b139dc27c096f9d86f3989fb5bd5d40f8ab GIT binary patch literal 41296 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 + permissions.entries.forEach { + Timber.d("${it.key}:${it.value}") + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Timber.d("onCreate()") + + val isPermissionsGranted = permissions.all { + ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED + } + + if (!isPermissionsGranted) { + requestMultiplePermissions.launch(permissions) + } + + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + } + + override fun onDestroy() { + super.onDestroy() + Timber.d("onDestroy()") + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> { + onBackPressed() + return true + } + } + + return super.onOptionsItemSelected(item) + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + Timber.d("RequestCode:$requestCode") + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + } +} diff --git a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/TimberDebugTree.kt b/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/TimberDebugTree.kt new file mode 100644 index 00000000000000..bcebead8a63e63 --- /dev/null +++ b/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/TimberDebugTree.kt @@ -0,0 +1,13 @@ +package com.samsung.matter.chipstdeviceapp + +import timber.log.Timber + +class TimberDebugTree : Timber.DebugTree() { + override fun createStackElementTag(element: StackTraceElement): String { + return if (BuildConfig.DEBUG) { + "[STD]:${element.fileName}:${element.lineNumber}#${element.methodName}" + } else { + "[STD]:${element.className}#${element.methodName}" + } + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/app/src/main/res/drawable/ic_launcher_background.xml b/examples/st-device-app/android/App/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000000000..ca3826a46ce070 --- /dev/null +++ b/examples/st-device-app/android/App/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/st-device-app/android/App/app/src/main/res/drawable/ic_launcher_foreground.xml b/examples/st-device-app/android/App/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000000000..da1dcd94e9d5c2 --- /dev/null +++ b/examples/st-device-app/android/App/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/app/src/main/res/layout/activity_main.xml b/examples/st-device-app/android/App/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000000000..fd08d47433063f --- /dev/null +++ b/examples/st-device-app/android/App/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/examples/st-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000000000..bbd3e021239ce7 --- /dev/null +++ b/examples/st-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/examples/st-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000000000..bbd3e021239ce7 --- /dev/null +++ b/examples/st-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/st-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..06c2ae63795569e977985bd8346bd76910e26af1 GIT binary patch literal 3735 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 literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/examples/st-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf22d879af102b28225750f5eb65195f222a330 GIT binary patch literal 5523 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 V&|BPqXEOi*002ovPDHLkV1hS8Z3+MY literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/st-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3caf60918eaae5bda79d365df43bea281c7f8fde GIT binary patch literal 2689 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 I0|fT}0FwykX8-^I literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/examples/st-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..07249dac25656321c4c0e3ced1e8a035c3444d74 GIT binary patch literal 7893 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 literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/st-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b77f5764199f2a486a5afb907e49a9e17c61ae GIT binary patch literal 8263 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 literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/examples/st-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..1e239a77f6dba0cb4ebcacc980715586e9ad0878 GIT binary patch literal 17524 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 + + + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/app/src/main/res/values-night/colors.xml b/examples/st-device-app/android/App/app/src/main/res/values-night/colors.xml new file mode 100644 index 00000000000000..088fde391464b9 --- /dev/null +++ b/examples/st-device-app/android/App/app/src/main/res/values-night/colors.xml @@ -0,0 +1,5 @@ + + + @android:color/white + #010101 + \ No newline at end of file diff --git a/examples/st-device-app/android/App/app/src/main/res/values/strings.xml b/examples/st-device-app/android/App/app/src/main/res/values/strings.xml new file mode 100644 index 00000000000000..fdaa4e82d1e679 --- /dev/null +++ b/examples/st-device-app/android/App/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + ST Matter Device + diff --git a/examples/st-device-app/android/App/app/src/test/java/com/samsung/matter/chipstdeviceapp/ExampleUnitTest.kt b/examples/st-device-app/android/App/app/src/test/java/com/samsung/matter/chipstdeviceapp/ExampleUnitTest.kt new file mode 100644 index 00000000000000..86fdb9e387fb7e --- /dev/null +++ b/examples/st-device-app/android/App/app/src/test/java/com/samsung/matter/chipstdeviceapp/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.samsung.matter.chipstdeviceapp + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/build.gradle.kts b/examples/st-device-app/android/App/build.gradle.kts new file mode 100644 index 00000000000000..f0149f2bed0926 --- /dev/null +++ b/examples/st-device-app/android/App/build.gradle.kts @@ -0,0 +1,21 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + val kotlinVersion = "1.8.10" + + repositories { + google() + mavenCentral() + } + + dependencies { + classpath("com.android.tools.build:gradle:7.3.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") + classpath("org.jetbrains.kotlin:kotlin-serialization:$kotlinVersion") + classpath("com.google.dagger:hilt-android-gradle-plugin:2.44.2") + classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.5.3") + } +} + +tasks.register("clean", Delete::class) { + delete(rootProject.buildDir) +} diff --git a/examples/st-device-app/android/App/buildSrc/.gitignore b/examples/st-device-app/android/App/buildSrc/.gitignore new file mode 100644 index 00000000000000..42afabfd2abebf --- /dev/null +++ b/examples/st-device-app/android/App/buildSrc/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/examples/st-device-app/android/App/buildSrc/build.gradle.kts b/examples/st-device-app/android/App/buildSrc/build.gradle.kts new file mode 100644 index 00000000000000..b22ed732fde2c5 --- /dev/null +++ b/examples/st-device-app/android/App/buildSrc/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + `kotlin-dsl` +} + +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Deps.kt b/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Deps.kt new file mode 100644 index 00000000000000..20847711e9f444 --- /dev/null +++ b/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Deps.kt @@ -0,0 +1,49 @@ +package com.samsung.buildsrc + +object Deps { + object AndroidX { + const val core = "androidx.core:core-ktx:1.8.0" + const val appcompat = "androidx.appcompat:appcompat:1.5.1" + const val fragment = "androidx.fragment:fragment-ktx:1.5.7" + + object Lifecycle { + private const val lifecycleVersion = "2.3.1" + const val viewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion" + const val livedata = "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion" + const val compiler = "androidx.lifecycle:lifecycle-compiler:$lifecycleVersion" + } + } + + const val material = "com.google.android.material:material:1.7.0" + + object Kotlin { + const val coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0" + const val coroutinesAndroid = "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1" + const val reflect = "org.jetbrains.kotlin:kotlin-reflect:1.5.31" + const val serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.2" + } + + object Dagger { + private const val daggerVersion = "2.44.2" + const val hiltAndroid = "com.google.dagger:hilt-android:$daggerVersion" + const val hiltAndroidCompiler = "com.google.dagger:hilt-android-compiler:$daggerVersion" + } + + object Test { + const val junit = "junit:junit:4.13.2" + const val junitExt = "androidx.test.ext:junit:1.1.3" + const val espresso = "androidx.test.espresso:espresso-core:3.4.0" + } + + object Navigation { + private const val navigationVersion = "2.5.3" + const val fragment = "androidx.navigation:navigation-fragment-ktx:$navigationVersion" + const val ui = "androidx.navigation:navigation-ui-ktx:$navigationVersion" + } + + const val timber = "com.jakewharton.timber:timber:5.0.1" + const val inject = "javax.inject:javax.inject:1" + const val zxing = "com.google.zxing:core:3.4.0" + const val lottie = "com.airbnb.android:lottie:3.4.1" + const val gson = "com.google.code.gson:gson:2.8.5" +} diff --git a/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Versions.kt b/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Versions.kt new file mode 100644 index 00000000000000..26a8513b03f369 --- /dev/null +++ b/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Versions.kt @@ -0,0 +1,8 @@ +package com.samsung.buildsrc + +object Versions { + const val compileSdkVersion = 33 + const val buildToolsVersion = "31.0.0" + const val minSdkVersion = 24 + const val targetSdkVersion = 33 +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/.gitignore b/examples/st-device-app/android/App/core/common/.gitignore new file mode 100644 index 00000000000000..42afabfd2abebf --- /dev/null +++ b/examples/st-device-app/android/App/core/common/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/build.gradle.kts b/examples/st-device-app/android/App/core/common/build.gradle.kts new file mode 100644 index 00000000000000..a0a78fcc24df9a --- /dev/null +++ b/examples/st-device-app/android/App/core/common/build.gradle.kts @@ -0,0 +1,60 @@ +import com.samsung.buildsrc.Deps +import com.samsung.buildsrc.Versions + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") + id("org.jetbrains.kotlin.plugin.serialization") + id("com.google.dagger.hilt.android") + kotlin("kapt") +} + +android { + namespace = "com.samsung.matter.chipstdeviceapp.core.common" + compileSdk = Versions.compileSdkVersion + + defaultConfig { + minSdk = Versions.minSdkVersion + targetSdk = Versions.targetSdkVersion + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } +} + +dependencies { + + implementation(project(":core:model")) + + implementation(Deps.Kotlin.serialization) + implementation(Deps.Kotlin.reflect) + + implementation(Deps.Dagger.hiltAndroid) + kapt(Deps.Dagger.hiltAndroidCompiler) + + implementation(Deps.Navigation.fragment) + implementation(Deps.Navigation.ui) + + implementation(Deps.zxing) + + testImplementation(Deps.Test.junit) + androidTestImplementation(Deps.Test.junitExt) + androidTestImplementation(Deps.Test.espresso) +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/consumer-rules.pro b/examples/st-device-app/android/App/core/common/consumer-rules.pro new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/examples/st-device-app/android/App/core/common/proguard-rules.pro b/examples/st-device-app/android/App/core/common/proguard-rules.pro new file mode 100644 index 00000000000000..481bb434814107 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/core/common/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..dca026f695bfab --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package com.samsung.matter.chipstdeviceapp.core.common + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.core.common.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/AndroidManifest.xml b/examples/st-device-app/android/App/core/common/src/main/AndroidManifest.xml new file mode 100644 index 00000000000000..a5918e68abcdde --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/DeepLink.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/DeepLink.kt new file mode 100644 index 00000000000000..a7d8c1f301f8a0 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/DeepLink.kt @@ -0,0 +1,18 @@ +package com.samsung.matter.chipstdeviceapp.core.common + +import androidx.core.net.toUri +import androidx.navigation.NavDeepLinkRequest + +object DeepLink { + fun getDeepLinkRequestForQrcodeFragment(setting: String): NavDeepLinkRequest { + return NavDeepLinkRequest.Builder + .fromUri("android-app://com.samsung.matter.chipstdeviceapp.feature.qrcode/qrcodeFragment/${setting}".toUri()) + .build() + } + + fun getDeepLinkRequestForSetupFragment(setting: String): NavDeepLinkRequest { + return NavDeepLinkRequest.Builder + .fromUri("android-app://com.samsung.matter.chipstdeviceapp.feature.setup/setupFragment/${setting}".toUri()) + .build() + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Device.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Device.kt new file mode 100644 index 00000000000000..48b71134dc8a6c --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Device.kt @@ -0,0 +1,43 @@ +package com.samsung.matter.chipstdeviceapp.core.common + +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import kotlinx.serialization.Serializable + +@Serializable +sealed class Device( + val title: String, + val productId: Long, + @StringRes val deviceNameResId: Int, + @DrawableRes val deviceIconResId: Int, + val deviceTypeId: Long, + val discriminator: Int +) { + @Serializable + object OnOffSwitch : Device( + "onoffswitch", + 0x1001, + R.string.samsung_on_off_switch, + R.drawable.round_toggle_on_24, + 0x0103, + 3841 + ) + + @Serializable + object Unknown : Device( + "unknown", + 0xFFFF, + R.string.matter_device, + R.drawable.round_device_unknown_24, + 65535, + 3840 + ) + + companion object { + fun map(title: String): Device { + return Device::class.sealedSubclasses.firstOrNull { + it.objectInstance?.title == title + }?.objectInstance ?: Unknown + } + } +} diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterConstants.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterConstants.kt new file mode 100644 index 00000000000000..c00e47822309cb --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterConstants.kt @@ -0,0 +1,11 @@ +package com.samsung.matter.chipstdeviceapp.core.common + +object MatterConstants { + const val DEFAULT_VERSION = 0 + const val DEFAULT_VENDOR_ID = 0x10E1 + const val DEFAULT_PRODUCT_ID = 0x1001 + const val DEFAULT_COMMISSIONING_FLOW = 0 + const val DEFAULT_SETUP_PINCODE = 20202021L + const val DEFAULT_DISCRIMINATOR = 3840 + const val DEFAULT_DEVICE_NAME = "Matter Device" +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterSettings.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterSettings.kt new file mode 100644 index 00000000000000..9bda4c3facf885 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterSettings.kt @@ -0,0 +1,11 @@ +package com.samsung.matter.chipstdeviceapp.core.common + +import com.samsung.matter.chipstdeviceapp.core.model.OnboardingType +import kotlinx.serialization.Serializable + +@Serializable +data class MatterSettings( + var device: Device = Device.Unknown, + var onboardingType: OnboardingType = OnboardingType.UNKNOWN, + var discriminator: Int = MatterConstants.DEFAULT_DISCRIMINATOR +) diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/QrcodeUtil.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/QrcodeUtil.kt new file mode 100644 index 00000000000000..1969b8f9b5a520 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/QrcodeUtil.kt @@ -0,0 +1,29 @@ +package com.samsung.matter.chipstdeviceapp.core.common + +import android.graphics.Bitmap +import android.graphics.Color +import com.google.zxing.BarcodeFormat +import com.google.zxing.qrcode.QRCodeWriter + +object QrcodeUtil { + + fun createQrCodeBitmap(contents: String, width: Int, height: Int): Bitmap? { + try { + val bitMatrix = QRCodeWriter().encode(contents, BarcodeFormat.QR_CODE, width, height) + val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) + + for (y in 0 until bitMatrix.height) { + for (x in 0 until bitMatrix.width) { + if (bitMatrix.get(x, y)) { + bitmap.setPixel(x, y, Color.BLACK) + } + } + } + + return bitmap + } catch (e: Exception) { + e.printStackTrace() + return null + } + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Result.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Result.kt new file mode 100644 index 00000000000000..9f80ec9d70ef64 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Result.kt @@ -0,0 +1,18 @@ +package com.samsung.matter.chipstdeviceapp.core.common + +sealed class Result { + + data class Success(val data: T) : Result() + data class Error(val exception: Throwable) : Result() + object Loading : Result() +} + +val Result<*>.succeeded + get() = this is Result.Success && data != null + +fun Result.successOr(fallback: T): T { + return (this as? Result.Success)?.data ?: fallback +} + +val Result.data: T? + get() = (this as? Result.Success)?.data \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesModule.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesModule.kt new file mode 100644 index 00000000000000..07518b68a36773 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesModule.kt @@ -0,0 +1,33 @@ +package com.samsung.matter.chipstdeviceapp.core.common.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import javax.inject.Singleton + +@InstallIn(SingletonComponent::class) +@Module +internal object CoroutinesModule { + @DefaultDispatcher + @Provides + @Singleton + fun provideDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default + + @IoDispatcher + @Provides + @Singleton + fun provideIoDispatcher(): CoroutineDispatcher = Dispatchers.IO + + @MainDispatcher + @Provides + @Singleton + fun provideMainDispatcher(): CoroutineDispatcher = Dispatchers.Main + + @MainImmediateDispatcher + @Provides + @Singleton + fun provideMainImmediateDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesQualifiers.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesQualifiers.kt new file mode 100644 index 00000000000000..b2397fe436e4b5 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesQualifiers.kt @@ -0,0 +1,19 @@ +package com.samsung.matter.chipstdeviceapp.core.common.di + +import javax.inject.Qualifier + +@Retention(AnnotationRetention.BINARY) +@Qualifier +annotation class DefaultDispatcher + +@Retention(AnnotationRetention.BINARY) +@Qualifier +annotation class IoDispatcher + +@Retention(AnnotationRetention.BINARY) +@Qualifier +annotation class MainDispatcher + +@Retention(AnnotationRetention.BINARY) +@Qualifier +annotation class MainImmediateDispatcher \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/ui/DisableAppBarLayoutBehavior.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/ui/DisableAppBarLayoutBehavior.kt new file mode 100644 index 00000000000000..cd9c99c80673b8 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/ui/DisableAppBarLayoutBehavior.kt @@ -0,0 +1,33 @@ +package com.samsung.matter.chipstdeviceapp.core.common.ui + + +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.View +import androidx.coordinatorlayout.widget.CoordinatorLayout +import com.google.android.material.appbar.AppBarLayout + +class DisableAppBarLayoutBehavior( + context: Context, attributeSet: AttributeSet +) : AppBarLayout.Behavior(context, attributeSet) { + + override fun onStartNestedScroll( + parent: CoordinatorLayout, + child: AppBarLayout, + directTargetChild: View, + target: View, + nestedScrollAxes: Int, + type: Int + ): Boolean { + return false + } + + override fun onTouchEvent( + parent: CoordinatorLayout, + child: AppBarLayout, + ev: MotionEvent + ): Boolean { + return false + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-hdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-hdpi/smartthings_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c0fb2c99a0edf740e73a30bf60bb780194e4ca91 GIT binary patch literal 21996 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 bwlk7($pL*0>$*CC;tEn%)`6ER+J^rhH!kl& literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-mdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-mdpi/smartthings_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c9bd8ec9eb676caeb6568f8d7fa8a82dd7ad4974 GIT binary patch literal 13686 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 z�-#uWQY6*ESA8LPQMXFD8I@mAg+F0%i_jq?lOT>WA^;i^^CQg3ANR z{={@|PtwK15Rc0o*y%5Ji`i1P#%&ynizz5nK&k2wJ~{3gf+5{RpBw3kjI6CZ{kdWn z^LG`$Z`oS}IaHjL(Q>cboYpVW#amn^ShuWs9$`pJrR-Dt$|Qx(>(?^Ad#d8&3WI=h zt(|&~MGvB)*Q3g>^5**2rRy=(Y!tr_eY{isPLxj!$R zh+B(nLd-Y2x?{J@Qj#ym8*-z7j2mednjDX+J!PMeUon?n8>tOg5f4w4TK$hUcx-q4 z>dtSLH?=vV;$HHpv-+jU7J)t)-|yU1S7}XsG@|&q_@ z6WCc<-9-n|ki$mpXN`wf`K;i|XG#WhFx)rVFI&kFiO)R=%l*yRdQq{qGj!$|bp+%!fOx*TD&f}XeI_+CPspWa;MTZuM2EBk>!7O`v<^+x%m4eK+Zfbp}hnJxpLq&1d;GG9G!Wu!tfZ9pW|XJIpk5WM zQ!Y4t&640N54gMkxVJC%Mn=NtEsLRNOoQWvXw`HQ+KK= z3gBV=<(lT$*(2SG9|dc|-5(udVez3>?9q%2BkhW0$Th_esfe%LROM18bzhk$ zpJ)a@`bI698s+k8C5-oO!Pg_we;%#+AknH76?@YD)Q+c-6I6D_Wi);CSCw1{`HT)? zQ?KEcOS5_4Wp4Zmev3=JunJG)WX8@gh-G*gF~JsInfo5)#Ud-Ld#|$sx2`t;_3QN* z=GZ_G_s6Gh+$QDTfY8vU?lvbwuXU_fmv#xhdPZzTMFy;m+pxs+^vILBQBmKo)oUGT zvGI`-3;6e&3E@-YFm~u9yxtfra}BaBJ1X*6P^~Ld{v~g(=*LgTST)&1;FT2ezm^^bo9py;}NF?M4Q{ZyQa3QC+ zdzpc@(P?tpJ#B?vJuci241IFMeV9QVMK&DX9b;}cTfxON0__d(3WDXvCEvL6h0|@i z^Tlz`@2+h3@i~}f|4vMYY98w3hN1J<+dV*BQu}GCHyh^0iB(`9C?~&m<;QE^?>EXf z#bA!d{Gjyc?E8Rg&}{U45v(`xtLvl&5ufsMXTj{}7YtDCs1YdFJg&IqQQBs6lPb0D zYstL_*W;Ky{@R;EI9af~ul(q_FCi-RH}&ygIi~Q;MDcKgP*Z>8_W7lps@a~A1pIRk z!YGklzqa{aO3sZ%?sE@U$_)E%VhOXeQE_7&(XXXw$~@8O9>^%xE1p|wl*o9ZslOT!ni-U6TaT$z^R&nm6AQ-&rLqF z8}O|JVA@v4C2eCM@Y;19Iwka067F5$c5IgjH07P*ED0OKRbYzjZOh89(JFGPXLjgWRwcC$1(i;`&f{ zr*XwX zHGg~0&lvbaiVD3xbC%qgmD-G2ZZBW}<1=}LlMaEsjc3tPFgnZ4ehm!c)V&T&II8W>-!C`6i~rDz{p( zS_;YBAG~&+V~nSe?pkZSCQDUmsG{R6Vwks#j>r-bqjL>Q0I1e*Mk4Fw(1km=Xo18% zr9u)?wBoQtks#d(UyN|xfmPPw!F^oh7&`t?XY@GOgMKY_lNX0(FOG~7ex8a%O zbM#wUV=)!l+0;nG-(*SIa{!+xC3$64IKo&1Vx+&6xo+R`B9{Q`8I)S^q&K3g4VogKi8?tSOd=EMOuzYuj*y@p`FwK+lxb5Qt5nnPl#AFgv zhDXd{qy8+U)NWGPCjtZDjH~oShtZk#kLbqQjMgOKKJX3oY;fWX&-~72QYAuz7!;R~ zTszCWs6}WJk=oN)tHWNy9MBKws+0*&*P$|HU5FZXfM2OTkGs5ZuOO2^se&)`j5Vtf zJ6+zQ4B@D6d6*72FMT+|zeXL3!x6$O_r%Cju-)-QqzGJp-9F`URJ%Bp5K_zBZQ3Pii;?2}!DEpTt5Bq{QK za2X#|O*RvP-ThDJF(t>)!=P~`+gPt0QGN^7CpiQ;*sAWY7xk3NT%@)BVfI=c&sfTv ze)Y^LsCOXg+=hiLPfMy34S=l_hE2F^1?{$v91L4>+@Lg6PTeT)#^Z30Z-dtRI*%+C z&&%elTW9S9N;RpfC{F^(&H|-?RL0z6>EB~;%r_~659lOo;UNFt3m~o3{e2*CmjqX_ z?rwACQIY8Dah&g3_TsNvD;33~D~C|-d~*`dD=dRXTax@Q`LF`3E(WGMyA;7URwmiO z;fCHgT#ivao}d*gt2ViCJ@Tc&@a*Psi!^M-7jc{ z4*AGe*q!<-568TugNQ<9-B+)_rZGpCaB>B3QeZeHLOj-9nBQIZ_c`$chS5&Lvc~jkU zGS2>Up&m@#sk1FO2&j9!mrI*dRWnD3ui85i4pAH#RziK?jOMzQj>Dgoo{1u7yZ-u_ zFcpSm`O~z2wN=ufG=a~Y();3@)U;lA9ESL4U*F@3Ybwb11ZpaF-UKJb|E(2nAN%Uw z{B)jTs^Gq>MfsRG*-d9s=+zljhh0#)RsWC^fx;Cs^vmwJ+`7kbtZqn!%WlK=y#O&$ zbxXoHq=-<2Mg_= z;hdNupHab-?! z;wRT=>z9lQjO@X-cBU1EL9Br&dZQ3(@|W0m?S;tJA8UV8X4nHo-3;`Y_06|XMWR-` ziH30xa%njZoG*9uFPn4JBhCftR7}@N%7sXw`n}u`zy^?5Ce2xM`YK}87xkW5a^p(1 z(t}**8m;rqMAmPpBA|={-S^Cpi&MmhT|H0RB>zn56oE{N`#ugae1ov6XRz;IW@a}d zuX*1H2wh%>YTb0x3wSkx6vjSS@h_q4cmLUK&r0AixZBc5f*Bc9>@RQGgJ%qwk*}rQ z_{}}q*`v8@xJ$FQ@lEiUGZDq>Fc6-D=Y_voK~YXJM~zGR{9K2j$ye%pQIDZcY&^{h z9K*mN9$02UK*eB3e+Ua{Afe}<3`t5_B-p?(sJ}ojPG{UKxA^Owt%VyrTTEQcyromL zy)?ld*8a6ilmT6*$s?SM;%>C_DH;ABO$RtdnApJ3O^^EKCL`EytRFl*B zXGh#9eh4Hh-vF13q-a`Tm7BSKGYWDNOC8JDh{fh|6=XwCArTa*qR|#+qEf3QC>L11g?DJ-&F{z5Hnq6agopNJ4MxKHXNLiI=;FhZL{k@6K9nlJ z3tY&`j|eIFQj(1;ZnD3gq#^L&c@DW56T+Qsb4T)l5!eLf;$71Hnj={^YQsG7A!&b4 z)Uaj+^XD~71(fXC8KvEyuV~hhot>nx#r*_U0_s7@WvhI=ON4pQxZ)A`!4-Ims^35? z8P-Uikp(TD=TUcKgB39DF(odqMqRl1@)MPNim%IL*7X%(og8a>8#%$t@@&}L*V zsBa=ut~X=6{_$l=m&QVFz(HCInhUb7iBjdG)9}VvpV15e`Ae*7=}!pS6N~G1$Pui? zzBDj~*x_aP^Co5eC4mzc7415%Y|}CWP>W^4Nnq7o$n?nLDpHSoXYdILf_zl|1=)5nV4^Zl&@{l}&1JQz0j*E4$0#WwIC&zdo&KgGX9kk6tWES>$`bhalN zXzz~(!A&ldlL&a8bDS3O_|N(_aO32j2KU0wb&Nwo+O<_Ap6Hs&C3~g{R=1I_q>-~H zm+QpHXId^LZ}uh*KXJ^$@nOmR4ehDDuR!UcAj3i%P%*?2<0pn6N7u2(0qe#z=@9GB zc~A1aS-_Lg)iLk$cWVvTjRk@3Z{l!{jNPKt?i-d0HXLlsP zym*5500d&f%agi6mgAk_WGOs-Os>A4{3gYmY;Pv zE};0%b{b^_H2`DdvUL*BeZCK%=OWX&im|`XF3pkNAKyP_#xjS zRwm#Bor$GI&~lw@6In5!nnX+~vKd%^^)lt8$B!a!zi6eLqgDn@xeR$r(|b;yG)Msh zK>&VKSIecMs#%sr3NcCF)kX0{i~dg$lYDOYKhd}`7~FMQS1t8v8CCzDOXd#ffGNZx zQ)^+L_phAeQt7PO=smkA#i3fE`xe;0Hn|?I}dLU8#Hvr1wB>#>2WqpjEX?OU0)()>E(p8GGMT@H;Z7oUC^WfIGu3m z2`@BWVwtC(CnfQ&>X5DtDtE~B#^DsKbuh`xwU=ricBgVYI~-t%@Ydr+pm-RH2bs0C zmDFP^5tj@o#r)k0J~UT%8;bVOKp{rwR+|1nP2r#`ibj$cXFphl7xhoOrm^4TU}jjB z0~T*Im_CCwio+2Pk+RIUPLem0NUf#+`KIdh_G{F!M0Vv`sX4Uzk~nO@e@55qm#GX>_)=EVU`Q&0FvTL_;11j`A;_`G9L;zbt;ik^ zZZpuL+jSxl)ZCcjHZ8&}UNrGGIcEk2o)o7oP6EDOXN<=$mtwiJI?oa0w>{q^@F}_E z{z8tBKkXQZ2}s5A`+MEpxp+C;Zn`PrhrYGuYn^`Xjmheqex5Ore)$V+JnyT^M#X{s zbiRb_biP%R?`(`^kg8}=t8@DGi(tdljE;CVLd+FJs_~SOgzFwHY1Wo7jV6C5dQr>G zqL#y!GaKzAFtS-BR7?Wp+L*jMP&-(eLxnH|1-5L!vGyoKgB+{KvPOlQTl@tDt0*${ zt2(M0Dz+r(T@LoCeX4xvVo>H#RIE~!@&HESZT?zzV;t$JXlF&h7j14{z+~D#yekBE zI(Ztx3tZZVWs-gT+~kcPHHj-$2Jz16^It_KF2mgm%cV_RuX_v1f;$`ViYQ1Wr4Nk_nJoe>tEg=h7B?|{z zY8TI%6}>NcebNa*-|Z8m93?P!;F?I;63(Q%-XB-3cL;G}|1kvzJWoz-UGil;V2We1 zW1uei!TloPrf0gSwoIT1S$xt@u79d}W^8qR5?fYDrA(rXqzMr?X9>YE&)dwaZgO|G zGX{IXV`D3%6IS8I2zaRn&|$cZLGJM)(R2q&_;&-0>uX2q;uM=WH*ees<_Vd9%oz)gStm-gYs_O6F9ccH9nsQiRqkR+++T73 z+RPY=U=w2RBi#95m>Gz!b$*Koje}#h*}`CMGN*~Vu~k#e(b4YQ2~*O12Ygp7wY}#= z#kH^t)Lj{PhxjNXs>`HXY8V$kj`FuEGE!q&3UPh}qKuaR)cV77IC4&!w=LGpBb7-^`MFs9(-Ds zn~lJ$G@iL*aLsh^hu?I0l{>r`Y+tTE=I6~ z_HFnskY`S6dl+6$1-$A>w4c1%uFrSzR`;tW=&Sap-3VoZg(rvNOP!fiL7yz3^4~yso9IR6G0#5{@tOyOS%h!K=|0TnVhjY=wYF;nE6=11*YzY!GmxhA`$&rf& zK}(>88--u%l_V1GpFrctAWZB$SIPX8={`MaQHl^Mf$st9M%b zLX-Q2iGC|-Ae1tN1cSTBN}BhliI!UmjQYi(D&+`tQD9J2Vp&nqD!7`hm8InVn{97` zpaDE(I%Ebg3e65hHzrF`42q`^7dNpqwEew7xnj81cT&@5Y$CmGV)@lv)rCmD+vZqZ zTlr91O})6m3;Cb+pOX zMm?0zTs)3d)}0e`Yd-m-OC?fHgQiY{PwbVJddXQ8O1%QIxrJaUhEw+v%zt_+!?ehV zPFQCzZbI<0#fM*Rz_~L#*bvAk>WeKUlyEyx2mg%aytU!+=|D+=Zk{}i1PY?Sr`~>c zet!G~`bRu*V9-#+(*_V7ULwc@Qt5h4^WKvp9$7fd#_rX)kJK<+CXDmI_ah#tT4kdX zGBaRF#ddw{r4S+!?0e~l8gH7qEPd<5cKxSlA*7WVbjRu(%pg`s`Z2rDS>8Cr89%xu z;k^sN6FAEJdn5hqXJi6{`;cC)XaCP)>r@#)(V%qwM#zDHNj}Fn?9g82v+smT&nHCN zV`7h09p#uTB(}eh{IM=_aKv%KwAk2br$PthE$s`z_c@=yTQC@6yI@F820n%NwJ!yL zLTBP*5QX3z-+k1GbY>zh&wEo)rdqKtD_sQ(BDq@-S`dBH-XY@oArW)HjLCkK+R1%i zJER%4Ez26}J&l)Mx0%Gg_b6m9Z`YO%`UhNZ&+~MWt7>ci(c9|Y`a)u8gOo+dkvGtX zW**i*@f1!LW+^6TMmcqrs=cedBWZ*0*3{--aD0YjtbhSXiujRA6_l#D#|C4_Sga+$ zn>L5^CkMx;7x>hCP=-A3dagRy@_FrV%+s5CutveKbp+WQ?4NIei z<@(O6Gcb{M^?gqt!q{rTL7$pVJag%yjn4k*-D9$JG=yvmSclA!h6_ITA0zn+4sLE* z!r)4I=1n_?|9R{mdWFY(TuY^dwI^l4?KH?eN zS7K+&8oj4HMzWinl!Ev#^++)TSLEA(l}zn^GcvUF;`+Fb-bYqO#Xn^Xw-fOsp}j~f9cmgKrEsBWCA2gt+@_3&KX|c%D^;! zj?Hxr4wG(&~uIE8G@@3(-JKDVE!Hu{|<@ zhzox@-D{85Iw=9f=r-ZZx5=BWs49#*qj~Q4~HYT`es^{C+hek(5JCS$J zKd{}bgfIHHQNu~q_Wt4WKwdFC&{bU`QNB1-lz zrsIxwP6<7t_-hFWBs{DZhA%@l0+PLAav|z9F0X% zrTElzm@}7TZ{-O}tywxoxZKGUXS!X(6zW0{4J<7=0j@WzZ zRV@sYiqkj>O{}evS@p&V@Dp30IBO?c!cs}%OU9M>vok58mrFp{H?g(@*mRnLfhgLx z@(X`pB$R4R#2Rp#a!ce$$1Fx66gP$!ewl%!yjg+06j`GY}m#myy`(3fIQadh(do9J8`449U2XPe7}H8X}9GBQ#4;XPY*F= zOG~H>R&zbL+8Soy56lYsndOaxOeo%dP zP-W$QpFlw5W(l9qDPEOn^3Z-N({puxnx;eG@5Y;TBquuTs|qV{u-V!Citd+Dggb-g zD^;UK-A;d}Dg4m|m>}`I(UOLQAqJa;&xK$&aUi+(@wM>t%C^lN2!-0a{qydE1L3&M zw5SXAMM~4qGUlKHSLk7W>g?RFU0!=IT?q0dO#i}JKer)||F1Ej(uWn5<(gVx%(6Ni zVtSQPw#6&B<$59zW{>}3{*-`&Zzn$S2=d8cpp@tbX;&o>xyX^zdy3EO{K$;J{qBX8 z=~s3%fp6Dh@mA+=wFq7Cyi6Qt04vkcHymn-V(IdQ!VPYT8=!CAbJb5swk&g40-=qp ztbLN=)fy}LjG?Bc8wEeVZsPRB|Kc^U8%ObrASx#=E6;Xr}C`KhRzB#X~qdoM#$iYC-O66%hBX*6(b(R zi$LHK2)Od{nc$5`&!4^-B!pl(Wkx90UqAp!SYYn1MtKZakgrDQLJ?E^KGSn1hJ<95 zHb^T1c*&DCmKY9b^C~7DZ}TBJOaBUgNBf-&P+eX*__%4-_B~>&^B1>u?9X43ebYql zH`0{%71C%3IHDq-#kqy`1=OLVCV=jy9RmG`Yul1Fp zxXAXjuj4rz!`k z30O7_!=Itou-au!O>JE66oKvHkQB5e{m%$koPy01j95^?@gr^^i5+ zFpC&2*#R;gN4_*EQ)PhY&iy;HQhe;5hf84%aeYnammlCR)+Uv>f*0+j5>Unu z$*=UR($Npx#ukh1>u$0X)NWx&IS-CPIA1N=&FatpIQ;d!1nU$jO>}GDZeqEb>r(ol zWjueI!^41oWY2gVLHJ&2MzLxX=>>YV*Ng|Bsi*e*e)UAshbgZ-fuvW?jN%=W=PLg> zn@I67_S6b(mk8ozEx}vN3w*I@RTk%_26SKBuxH_!a4VB=8MRE3J#*dP3U6y0QRv!x z{d2lD43!Di_h}Z+d(SO&l4U`&1U9DdtHVb$TmjiXZG3#&3?cEDw)e04HO4g|4P)jH z%S4PBKk`cOOghfZ6=+Xaw1a0?_op%U#{Q;j!g@t!YrLXa_hyNzkU1GMtEx+JjigS z-~EGy_|6Wzj$VfsP<)CY8kQA_MK~2-3RiMdMPh}!}SnkJSxCaVoO3NF4(GEA zt^zl9Fklo;lb;mgP8AxJP(Mdax}<0dHVy+^u*_&=`_XKD0(qSNgmV}3Ps|=&63_v> zGZ+KB<)b-oOkS4i?lWQ(qI#{63I0)-!Wl0rZ0i#$&9W89rfRiu?un0ZeQ-zj!Ja7} zUh?|`R!y^NlGiqu8&_d!0bFb^skPdTs&51NdU};ZQ3US7vGPr zUhq2af*o4@dk7Nk++XS7_3TI<;({Y}DwoycV=9(EVF&a2mR8{Ib-fqHpC&bIUWf5# z8tw+sY=unrNegrHCi*XYq zJJd0C&#}zC0If4nsI~<^_r51G!0J=n8o=RWdCB=uK)9Xdc>)CUZgyo05uWOYo%#8e z`+<6mRT5Hm_tu+UhQmjppfJ(?`CkA|&5gyRrs9O^4J#*MpEd$Pm<<`~ryGBWr7M~f zIfvP8XRoqnHe5%uGr_E1>tF|9lS+rF(c;zpxYdmrC$hot7fpf9UB_D4kKW7$D;t|- z(oiw!tPsCg$U~ZQj@s@=cj=Z$u(Dn@;M~MO{VVvZIMX;e3neI*f5@9HcpTSEKoqzO z4o6!tTHjNb;f<~>8shR*XcCsUdJ`=(Z50dSF1|)VL1{I;2Z{$FCRnT%;(tt52`B%> zce^sq)LW(rPtql$RBtlv<6PygQ*X#NGrJP=n;`{djYXs3>X>}tR#(xK5Q8aP<3mTI zGl7r}(Y?ar#Vy!IpAECdN$oiztEQ~&UbpT+?J|Z$&50uDIip)y9d@t3M}1~5A0fmx%TNU7i&$kj z!c~|eex{qb9Dl&VH2-F!R%U!XugOWQcdrjR=95&u`}Kb6`DwFH?(J7v+Dl<{;Q!Td z=J8N=Q5?6GsnAUJZDJ6;jV+Sw+t?{gS+Zm)vSydH24gp}joq7FvSdxRl#nfJVk~29 zA^X@u-e>6jeCEIB`OLZZKKGt`?mg%C9m)(Yl-|G_9EPRkp}d*SJ^NO9eZPHcDb2ic zWa*O``^n4QEOM8C7+BPTwi|w|oCO!Okz`%!L(CT&Y*ydokIG=`@LGL0s3Fku1XZy5 zy?W2;z`dh?ovEoqYtH^BnxK7jRGaF%hAyiBJ=WKUb&om{tTNwc+zcG;Xlc3$fiqb4 zNnAHbpx+eEPRTi_sa%yfGBAcnG`ne*mFSJoaJKZvYH?C_c590}woFNmEO<6nRgQBp zu~vfOSt%T<-y~V7U0gF0fdZ-T4?PN&>j%2TdKvXvV{w;hb)S$yWtbgu_Z~wSh;p^@ z{NuuGtiDieqOJy*3c}W!onpyZ8wovBhckiY) z=@wP`3OG%!uu$WZZ(QS&+Znbp(wtG4WuBex(qT-&reh#Q% zTFY|bKG5?+M68W=mv+40#fVBS;AmHf`>iz9toLhtXV8JHM_S=j?GXM^G#F(3dd9_S zaH8Ep4rvh(aO?nK(NZANy&o8omwapd&wG|M32q(iXv!-rVY0x4#%x)nET%WVto8LM zGJ<>8Q`I?As9coi24b1J1gM8J&#mdm2+&06$#i7U7f&# z>CR4nxvLUB8R`vCC}1L4q8gguMq1^DA2~1zCh^NILtM-w`&E3_r$64^9@7}&ynQ2+QA0c(IV$%cKav)(CyH(VVyIq zP0f8#8FY)KmkB3$i0hkTL+q&J(D=$^nF-B&Ui3u9E&Yn>_enPlp?tYir(Z26+G?%h zU_s!i9S#-;s|!r5rOt&^^`@#_JV)Gwc^c?vV1;PA4QW>82UxbAWd=BN6g%y(F?KFl zZ$&Z0RfGIG&hnj}l4bu8Vd3O=b$PtLU<0B&R2i>4)jU-+Na&PECkc4N z?G!bFAIi1+M19JDbvPD{+8;d(a-z3FK|;Y=7cw5#5!?dG10;t*Sn2BDdDEQED1nQElzLJ|%MQn%h7IG|5_ zMMtkPDNDJ3uqKvPhg`orO*(cYFZu|a0gE8t6iLSUcQDX4@jxu_r$QLFJqm8_kPKMq|`!174g+-!WCV4igy43Ym|JVOA=Rc;Fv< zL5NhOS#JvUKiIqPv*@Vy5$E7WNBF~hcShYh`*!F(L3Du)-|Vab&(p{2+5A~Pgmaov zJR~0l)9km`D1E|sw{)mm$2pS@RwUsZ3NAcMwatpi0|IKeMLedM{w8{2gm><0irxPA z-M!7#X{chrN@tU#EEEz{;`nJXu<`0T)FJVYDMQ#OL4X)cw5l?f&v(G6 z+;lADKYu{KKec8e?ul_MSlIH}AcXbq57$~3y~Sn{Wne<|%9sET;D9*`Z>_<5NM+kn zm@**#ZzS8JTjC8KEQ_!#t2#j{#p<-eN~htU;KFMhJ6aILhS`1zgz9B!Yln2Etnf8n zUQ^rJ)~oW}T6Uwe)B2 zO2bx*mdoc{sQyfhh`Dbf4`A!xX7Hs3t3E&LtvA%W5cpzW6g-;hprqHn)pO{k>tjo) zEwO~wE`JlhNy)&k5iQxyYStJnA(t!oV`+5giT`3F{0N_X-4a)*@cj2uA-2q{VIf5z z(yV};<5Wl;62xKp;^)%a``x)xe*3i!N5dv@6l*gm?-i`t_UysUkOcv3v7sqqHIH#oJXc?fyez;He*hfKN4n+ zh^3eI53ch4GEh!wN>7mxE9Ib_fA8Qbn^ z(e2Uwa<|z7p`rqw?e5;%tj|AJ5x!CIRkVRJe_*Aepd@E~yOBCxjpK?JY=xcIs_(sx z;{nlQD1xiKHJI9%WmE%pDpn5{2thcnVP4YjJ(CINqPhY>aoll5A{%#Ht5ic-8ZMi+ z1<4(f|2A8T<59j8Rka~s!enWxs9T>ns9nr(%7T=!%&1t13J=+S+Xi#+MhlYu)u^Nu&he!P{FG=(NFu$!((rI#9T-7{%|)v0*DP-wU%Z} zyb}*^3can-ZLM&bZf*eXnwnH=6i)}Wjch;wO}9;K_M(sGgH!Q_a9s)|a!Px_n~ry- z&BeCq-W`wmy=83i%Vk^7e1NmWz|lAL>0LYGDg2w?f@Z~{ozmVgVgv{y)}{NsFQfJ= z%$--olUcenwc2d8+Gj2qV$>dJ&gDMjY0V&1R&rc65I-AG7Asko6gJwnOpsEXlDb=* zgM-7g9ROw!^|z7g?;pnmbfiDatEF5_^X(tM^+K_Zde?@1t5RRYU7wBVTj!Ugp_@94 zwO^uC>8^wizz6#(F8f7)rwsXC`y(j6}@|%F< zv{A)2<8;4b$qOm$3LTsn7LaIDZu$2WNE4*Uq&#bHZx8MHmQ9>|Mwb{aD+B#@FgKT% zPiCT`$5Fp6c)GGwh@YuCq!LuZj4(MP6H7wQ7uw`-*j)mFV39han;s6Oonv(hn|HK9_B0$)M6f)z%S1s_6Zs1vwQ1wfvbnG`m*Tg&}( zYQ`7(BY}Mk3qXe%zI)a~|_5TokyNcr`qnm`+|D zne#(!@svOoF8L&M`L*ph2feZM{mY-i?uCH2t^1xjIpGqMlf72YiNL*Xa`hL4+;4sSG}u5ad^x+Hm+s;O0hQE)T~D8nyLf+baqIc|Rz zvw@`*mz9~{cKF_7Tdzp5LvzNT0nt!1Yg}CA^-|*DCApY803PJsel5;9=oP#sV&IXd z;%xi8TpyyJixYlo76j7|frort2?bu%b30u1ZdA36-%#`R-dnG#s%qAKFm~oSLRkB) zvR5(5K$!EOvYKD2Bt*D}W9D54^f4XZDldw(;Q&9ef1|*J8t7`(linlQ2yP`>dPRrt zGQ?B>Yakw;^Fx_B?DRF12&FF~B=L`upf(MOf))s{be3p3Zo@fs`B0tQXIm;tg!aQQ zs2Fhn5hWZC#5{0LbuJJp%bS^N`@!ryj`*c#3>VHi&7~dc4BLFVsFN@K*VS-}LEQ2e3{;Sr|^drXu)B$3}P@n<6-#ToNE|Y!be# zI7#6AeZy1)Ie{h90<44g5QVFELwU&mLfll&q18f$fkEuZRSvqVqf?*CIFiuoMVtY4 z)F5CNa_Re)z27ncex0Q9KRZe%1PwFW4Aedwr|_S=R!ZtG)2~Ycz`iPVa4Nk8c^d+Zc=7jf5g$QG9jGHf zk`=?1h(B{Nlcq={5p<^q!IVs~*CY1L(S!t%yTJ8#jwOr4fc5bZnDmP|5<<_6M4<6% zIEK1M3+-A8J!2M@INFK;f)^4_&56uco$N0`@Ev+7Bo6qG2V_sl^ns>u!ZndbMn<~2 z?!Q0N+yKrM*+GY^b>^l3xlM14V)S#b;8_DfumzD)u>NPKx-lM462}EAd@{@r@R+aw z+F;T?OHY+KM<8qE*RP4vEAqiIzlZoEbEKy*KxqVNwnK0#px>OnP#=?7> znqEq17mRo(e`OY^uQ+w`c3cIa{puS(A@r&gCl{dz)Hio?qw&dry#Uv&79HIbk=I;e zV(#%R{TC~Lr#T|-M^oP5^0!3wBojd}E{)bQ^Hr+}yTQI<^IRz{b3mbX`NTds_8R`G=- z25vcARNrGPCnrSdCMTS8?!5iusiSCR(SoRn;nRaQDKzjOWhbSmk%OosG!z%22}7}Y zF4N#Yk-s+7<>&8S#>7l$KRnwstcv(Q-5)tDZLY7+>lhh%sy{e$^*nXFpBBFZp}j7m z^@3k}a-TV)@{jxZaS)`i5%L5z7z`1lP%3v8I^ zLGVOG6rmJ$x{w0GPjw9q9^2E6wyP@L^@+m5LIb2=NWI+)2%u5v-m!UOY-}uwMJ4fc zu?vot*r6>>1E9lnld@Brd7y&yhbp?cy1L#%2IQP3Mn~HuBqUxkODTk(;w|MBMM z=ZQG=YvG=sIa@*1Sid4x+pY#Uf~ft55S6)5h=X8GL(Yu=z^pX$W>x@$!F!5|l*u8A z($f7Z1rJx23F%W)Q=WoO8}}gBi)T4_A!e$uH%Cj$>CN^h*>MmM5a@9lxSg~lB_%mW zHNlLkMOK!P8OTLLEq;dop@k2${d-36rZ0fd7!b{_%gWZml`ZJJ6%5l3?a2KGXliI= zWcnEY>h;uOZEgK6pZQj{uNKw=GA-kbcH_A{wYxR+_E@13K^7l8m64Gl=e-YBotJ$Z zA09EJs<;Gdm$jbg&WFi2UAKNFh-F z{X^s5pi))6)#3N=`bf<=zne9pH9klfmwQ-g=g z41Pz(rluz6bRNs0XnK9=0f(lo7XR-@zAy&>gQ(LjU8&x5mUfn&vNxZXa_)Xu>Mv4C zOU+O&Rys#)0eR?}P3s4v4U=I%k>g)G& ze2@BK)hVE8aQ}g5Xn_Sw( zDwB9S^WmftnJOE2{WOReEdWyg$Q}oNnGh|VN=6c?@yYg4qGLpRP)PXg8wF7h%GyP| zX~;)!HUQAISzqz`Ct9bu^<-m==C5na#ex@D!9!^MD>WmA%eI78l!X!r-p=LPTrZkJ zuH6TM^PM)V>vdU9&0M#f1g&8%-^}@4QfB5O9b5q13{jOO{aYA{BQqODMMn?YT3Kxn zvB^EBeNYX2*lb`%#bc9&Xa2>Hxt%FNDQoZa+b>5&|I`*#W*{uq6-fP)O6K@X9JjSh(Ko`9o{(E4Go&W8N-cW9*wI(Dsx6X%Ql7z2D7 z%P$EWOWeH+$;acFJ^tSJTrnm%0m9!1*_faJr*oQ5vxG3sb}i`DRh8UiWrqYUAzofU zoL6VHEOa8O^k_xnUVm<>^> zu#DCbrR`#f%*o6|goj7}EpL#Mt^jCPuU_|%aOe1< z;0!Z9c~SH8BaE+YK_8<}Qn$G70cdw_bqFkevQd?lpHn>n`Ju3MjD*6KBjxaZuOWpy z{%yqlkA&P_VPa$?i%Q8?oRh(vIyV$0En~`rPk51N@$Z?-C;abt027?rj2LR z94)>$BTDra=t29bqcj^syS6IMdMk!A!a;G+o=%@j^sQ>=q|_TluAM*Vj)Ozhh+@2i zR9eA|5wins68uuXr&&{s)E^~iku);K8TJnjOems7T`irEOvvX$#BDpwu@UTpt`g!M zc5b6u9UYqKKO+tN!xwL>fj7}T6`N7Ux&PC8ov@YtUqpPot#lI5u-(FL<;6^`A~Y&@ zNAUeaSS^Q7m?HMvU9yS}I~g#XRt=2N6Lxkd|KF|t;pH^bKb4k<|1_dfy`sVO)Vf%Z z_n~_(+rDx;HaK`W`j2N+%ezf`9IZB$1eQsA48t2Da#S7yo{DYk5>>S5UxPS*{R$>o zTFIcas0PE<2zR*8kwFlIakm%NU7`#~DRkEwF92syUVX49ATP{XiJ;$)o`od&ed6$y zbXdL{0#Jz?e=d0HHvs#4Q}^G4w9V}^hbU;*#?}fA3Xy$zI1p6$JCga?ic1)k4mJOJ zo;u5yW3&#^vWyStGeJb&-y)f zy!AIXb_fYnN+8(R~-zARUwo%teDTN|EjTv%5p57+zkZj*?bgW|^! zv>Mh#1oSgCgwvdH%Gj4K7up;HAq?TsI-?&+$;o_ZpRSvWZ#71^{uxS|A6(*&xRvix zf6Y&pqwXhI19&BugG306Ya*}{a;H>m+{f-`-LPYk;MF*Cf`Y$b`YkL(9%2bVl;f46 zIC%4Tx!4fdEQ{~sqlb;>i_Otaa~&IGG$lHhMC8;X$L9T3{MuVh!-b)B z`-Gb!7VorwL=(LFIZnT@sAC!X-|f;|8_7lXec%Jw0NJ<=~j{-?*iBi_fta@sCL zrQG3Q)ikBCy4lQZn7cYFcw`9gh@fk&8M_NB^X%DTexmkbP2d;G4mbeB`_U zx2C?nkO_9kW8V(3lhW|s)OZ8mEBA`P>MgyyKSe%e<-21j zUdcu7hhxa4kJ0h3)1hNxMcxPIjKu30i@Zl z)n6FJ{Da+qCP6*M~?0tBa_5iwE@ z!sp`uXySOPslpJN*$57=Ci!5L=ppzuaQ)i1l`1;5wbMjQ^V_?c$YB(^`osXiOMRnN$KfUDD{7Nag$3o!m@h=)!$`*_R-;0UO4EZ zPP~z3i0`oy`TE4VYzqr%`r z>p4kv^LH2ATov;m!G)KRAx|g`=)c8`zdCFaH`m=LD@d`9%ys%@+)r1YIGRbsM`z*= zLfKL?vimM>6>dJw6UR&V(p z#*ln8L3cCrcl8B4Sw8rai*0hC;4y;Ih1x{6!;Cn`KS6}h<`QExO~w;aDYbKI3wA$| ziKJUV7+ppg;WN*20{vp$K&O6>Xnu1GC-ay=5xG;-;4zX_^O`#~rp$|^X~)(-mrd{G z`A}QwxX6~Fg>>6lKk$=KRJxu^Pk;A2-q@aN7%dAAh{E9|;nmvrS&v|9wYF}aVkIUe zIpG3%4F5i*U1{z^^eL<&^J8-(E=SczTZ#_el@2W^mDw$qMV#Ijq~?g5qvRlATC{2+bSTAOs(btajbmyuQEFIp#c@|1|KcLl z(vj!yHz0${o%+wzX06gAF*LzJT z)|W4%2v0r+-DjC2csAKiI5j7Zvkvm_?b*A(*a-$-?#?pW8;-ZA!Z!=yHG}jba!qpL z5r64|5|f#sRmyerd&hY77sC%}yGvQu@bSdA<;O<@$0buC;)KC{X0g0Ag#21@x7beY z6i@r5P{H@&idk2!yQX9oxUQT%_a83f>g>(x)5g=bixVVcH3vb)@rh58BW~w zSToVAxu+|>OYyxza%h*r^%8^bgXP@eG0lY!I)0$MoDb3A!mq)=arXw<@GMDhKO_Eg zNMem6d=C*4#}&0mmec3b%B!|1AE5m|D~J`Df32MzT6zUz;cjS+nyhA)`KQ*W6T1(C z*hw}NoLF1pvth%YOAsSxivF#Ss$SkI7)F)`I&|GvTR4^5^FP!wL}k{dmgc_**_byT8k@QFV1TQ+=S6BB}(l zD#6*`!O3r+ZZ5u*d7lWgO8J)X>L%13!nJ#hd>AB@&i^DN+kal;qJGUmJQBg~)hH&n zqT-;2&oEuHC#b@~O8K1q+LwRRW)FQVS-dmxhnv4#gMZn)eC#q4=5R$pLBVTW8G9Mx zyuR)D-V;HaxToUvhpL#SkMF7Lt42405>wIcq|8ZTT>0_u;cgoy&YnT?1!7jrY%tyW z@yyu`s}JVG%TP#kA6(XntEFQ$h0*cJz0M8GguL2NO`0;W8u`weacx7&Z^I0;JwY=VQ0OB$5ISP@Oc-_oAPH?(&vi!+g;+xPDz z{d_?ZgZqt*xSSYTRxG}K|8~pd?b4w zSH1~%QO!WKca`m~tdVH17k;u+in*rJ;?kO!{{uC!#K^m9${_-hh;!Mg z|LVa-&LBn20a5e}WXj%4$vXDYeiRKkGo+uIOfi@BdnN$>?u#Cah%TN-@sP`1IQ!74 zZzugTvazi>1fHh1_;Xz2ZK>gD7v4$h9hcn2YMGNlgcsCA#*h5a2h$Zoo1=7y>+PJM zN{O`;u=QhDvW&vR_vG2BwX>UrrkTBh*zjl33rLBZlzZ6Wc5*VZyZ+2l{JA_03jo_h z2{o?)h%Tho8?%cCFUjs8n34n1yO`e*f#tEMFp`VI^3jf&2@@TIygo&Ty1RRah^C~C z4Nn&~xg_W^M!m<0H6vk;4}(kM_G_P{x)s>#Xp%Q3uo#&ZZw*ouE4HDhiGAos z{^S^s7QXH~v;TE8GXW4oonnEu^0gAt6$$>;UxzbMdFaRbO~fH)RszXkWd5}lhuih= zkE`)+IUI*89UHd9fuLA?0P5;{OBb>L4z;zu^`BjwL7QP2QM5+*RLAlcxHqM9S&A4_ z2`T>N)3OzCj)QoZz;+1{cLLe zLy7oj?m^Z;Quwo0SW{Uyja^i-v$jpsmw;x<<6bV0to|-NYdU^N|F8IhD%B@X>)=8y z^q|TFzkUWLe#&^RDR3H-VbMlHU#ELL0hZ3ve`zK-Z76d=fk+(ecz7rMpZW8ApU{T=A*n zo6pW7w$3FwR^B_TO8z@IPudj z%oL@(gB3}E!EIUhtqGT+aRH!x&)OMC0og>rhZ}U{R?9FF{lF`OQa?v5B)Etw5Wujc zPCo4hzWFAERT&u06Qd0kfyQ^`2P&nW9eK zC)z}JzUu^buJ zaLeyPjm;wpp<3ajYVUqI_}5o>@1pVd>DGMd6(TbmlxhTrTKfJ#z`DC2@k4h1W2T-`0)ZzX@&s}_k z0)p^thJbeOsdVD$|9~BU#@LQO*473paMy|@MiDTr1mRRwLLbu(oy9Yv2ptnqwv98+ z@W?hwtnV%a#GXwkHnw{Ep-CC48^->h+~#j|FduvnM*D%P|E2sRs59;AjcoQu$7j9h z*%lCg?`cBlHvmp);OrADwn0ZG;xgTKlrx-}`Tl~x{8XuJ5;_PZXlb?{e;Up))Nb;S zK|kl7Ida8XreJ` zP<*H#!1?_&jz)`$>v&jfxP-x=YsDu>*Wo;hpghK#Tk+1qGn3+5>&elyYvHQ*map$W zapnrK(8pIVYzoX}?{`qoSE2U|(Zh7>Qi7 zDW3NDRaU0a7ZM_v?Ci~FA9kIUe?~j7DcpI;FS{SzKmnOO&~k>0`nVpazV~tn7(ncY z0@Cn2wJ8T1)~J*-_AreR5V$>MiE!N)x!}5HQ6w5h(t@oTC>U5n|2z~kU%kF z54xTzZZh}b68V}GJ)1qV2E2~rj&lVW!CO9&nbpG!6e6ipQVftJ14kv#p%I?z`u^8W z*Gd&lxp!(m#TPvMS8tY?;`_3-8VdKfoYFqzwtU^oZui)#T4U1ouj|2?rn2wHSHi_r zLCQKklBp`dqEr~I!?ic18*TKW^Z(cbcZ5>FiQ>r(jbe_}rNpY&@v#0m&pv>oiW$4c zbnk*2J3x|~!8GE4F|Mj~57y^0#Ui;hie!gu@QJpLkaL!E<0ho4uSGGh7V@@$O?j(H zXZxpAszAL1!h(w+N9%#{Ik;G68CjzBJMjF+^NByJ5tdc)MJ)KawdY>Ig%+W6ZxyE7 z+&_s3Xu&EBC}LO#mluR$my7O*OzdvFwjk8gOi9A&@0P3{8v!Jmdr<$;`Vur3u#l3z zr44j$J6n9IMWW^m+^n(w?d4iMf0kQ4HW}9zu$oq4ek8Q+jYA~B?b}17^9A#-#Cqtz zQwfPpDBIDk{25-YlZQn0$V_9Oz(COrD!&Du-c}~R$=NQpyW%^XsRb$S2NsBWm4!io zn!7_Hb<^kA860>i^OB>S2)xsar4BT=(vS{Q3f7W{r#zcA-Enu8EO)IF*ThGq?EPGC z79vG+;Otj-^)6mX0;;MGqz<*Ux}ye0KbKaF&F|f%QJ+5@roV0h4lXY9^_p)vj7BZ=m+O&S zixG4*x&X>yZD^{|n$kx^k`OA7$@5u27<4xhazhaf+Qt1yKVT|dYZTa(R2Nw{FXnE# zM}#~A%=9jyFBpk3{@2qm`p*){=E%WSdhc;eNMYGAI zbvWIEdqbF9Yj7EE)}*Q9{aO8;O3H2t>({35g2V_Q@m0nyea+K2I*-2+vtb9EX?$Na zxj7M+rzZx9qyHTYeiqk^L(7ay2vv%RC3ueeb(n!(=^KGy!Ehi%*Dd-{&S&x4-A)Y# zh0p@z$G{2rJ{e(Ry53Bq8RJ5B)0cEedVcWBQ&U`YI&SRWD^qQ4vQWiVqUv&FQD8Z6 zaz2(4CmNHIWNsWo$k6#mL5f-8SXPYRp?b}3XK zM*9(LARg&G(6NWp)k)Naeh8s{luu%#;945P-Sc=`lrTO)_dX+l{o zAB**Zt)i^Z?^zs9_0Wb~szIzpz)H&v+1MGA`Ajafrg6nrqPHMDUF<+_h+IWnR+^o` zTxzm?rA}4fd|_o$l@C?K*;~#9G7{#DP19{z^%h>!n{fVRBe9`97+Kw_T{bpwP8+NK zg`7ynX@l|6m>?8=`+`TLOfw?Q&!jJ((bJN-V==MtB8mNS@x7uF&BDYj*ih zH}8ecvF!ofiAchs$&d5jQMy5`we(w9j?x$0qH;aM(WWO($*f^kJc9tGK#pcw#(ZX< zd^2K*=12KnF~UNH&9Uf06gpV-RlYt-(k#sL{q6K;&ZQ}~`kf^vi;{mgF=C!32@L#N z_(M!N1&fr}!aeWYQ zvH@3Z24gkTTu0O<`?S%4EPO1>3wsxT7rkWK6Ep1kb?~&l&k~+0AA9(^PP56)5L+e5 z%If8QuCPUf&)Q012Wor-7AyhM)bxr(^c_elJY?RpMUPHGL_go;Ph5ST&S`fi@*I zd%o=3}N3z}$4hMq@jo5&FjU=VwwAGxY;}iAk2MatxrTgpI18%X; zy;q<@`~37Sx&Uh*(gVd=LQ@%Fpzrya*lgf>fG75P+&A>qY&TIb92{Qz8w*gH0Ilr| z$bWy=>59*P@?9d_xGf$BVMB}oBMq#d427lzcv7Q=Z>S8CzsU6V|;HKU^)fXAgiOymk#AG^K~eNlR^)3!sy z0yAP6jq-$@|9F>o$}~yxP>bg)NgGY5q+$ddIP={bWFWIe?2YQdR++uZ@||x*_qW=4 zTrXxw=qU3}UFPLQ!E$_l$M$<>5jdWb=RMo3`xmm|LXUT43bIF3CtZ}+?gK*a(;R{< zMqN|A#JuxbCJ_mP-=!PDh3TaZ9S!RD>_32J_aV-P>a?1;oz(nB5 zAi+2+CPzWF@pH=qGj1V!3ZY`~{5__rbE(H5JL@1n8ZAbn<<#t8^65bcTW2F_Ewq^XwO$YFPFWdYo-g)F%D1bZA4_)6E8sN>riALi1*&`@OCVn?72cw{f0o<tAl3EVaGY^;!E~^k0Hv&4Jek@iKN=9x{_uIz z4x3w&OUEa)fA}W*{>3zI0CGwDN`1kGcL@E#o@Z4tBZny%4a|RXe7gx z6V*FQb8i|~1sjfv)sQ7;j*#bPa8RXZG$=UD(bdA(Z*1OapddJsd5pp=StUm{i zTD3ElLL4W~JQoVCC+V;erF;}>bCLdQsvrs{?Koe`nV;*4M3Nd)IXZD4u;aF))u(1? zd}mVQ+#rj5Ut5eO>ex{@NL)j$xNfyd2b(pr?9RZxOro_fNm^d}87Qsp2gJzzBl=rH zc^7q+g>&OdSI4+SI+kvn)!G0nNPcmM zijuC@;!lTt6IGwDwiL0+VfHer*bb5VZ6sp?ONg`YRnb^e<}2#$jy#3P>1^O%_lpNs z+G`Bls&Blj?g7yt==(O1K^ry^r@Nb$Ikz3r<_O;~giY(qAt{sMtB-0c^3&`0=QzKf zaRP+^;f=6$L5f5_b6S);yT}X{i8yvpPSnh;?tG*AjP^xVp4mxbu=&l%X}-eV1K=DzA*iuk>r89OjdvUIqg#XenFl`J6TF0Oe`k1FT3?T_29!G+$* z`MKJ!Q3Mb6k%@TDmbO$L3*Ri}^K^w621IgqM7)L~w{`g;zIyw1yp;T~Qi0D>9<>D- zdK_*}h)(sqc1U*aC+%HwQhpF9^@E0LH4^lYSNq79U85-dA9Ot!jEhltw@*H!vQp3@!&7ChT;EPrx`!erf z_b)kA`Pz_ha$u`U!E}imegLP=QwRCzxsdC{TpzeEky%`DwQ-U>Rtx^Gm~-)nsnU6trPWZ^%r~Ah!J=pf#hk;)h2#k zd`}+eA2P{H9exMF@BR?p>>-F9NV|F`scrph?_yBz(j0dR+S(|(c@JeO>8Ff0#Dw8; zuF27azuf%$dSXqlWiXn02Gw?<`vG|@nfSZB$+ce@UO`c^4~Mkd@^klfJ_?825>lU| zcipw(K5;^@67wt$j}Ss-3=q=sU$>XHw_l~+fH=}K^-mI_TL5BaCWD!xdI# zeDjGB;I}({*jcf%z}1#tem-gic;r(6=La&kd|vh#y~Ohuf+IrRhm7!CmjCh$a0&+a zv7Y8+$6kt0cGuHIcsZ%zy*!M$a@(gn<3;G1Jj_cFa?F31S*ugXyNm#=XUfK}W4id44HHs`& z6Y%9IqAVFKulA5gPl*@FKX7FH2KReNKXay3oUhN)Mw*^onI5}qjUPhH^=e^SjsUQ zqNIuIS2Q~pNHDWh5b*w_y1Lr9@}JTj#v9~GCzYd$W5FMbLHEUohy75vo`7gOAS-S9 zPuzL|v*kg5s1CFgcnK@?8F$eF)Vv~VOiXk!wh%MGhC$hDJShF2LYr%X8(&6SKVVTl zkzK981`Z|_P-rk*qIzwol3)DMdjWXAbm%W0>adz;g~$mxU-4=MY0GEaki^ft zwA01TlC&lB4+4*Q$Fi_-iI6wni)=P}rmv|FSa!&e{~~z%n~>vg6-B6=yX7Bcp@p44r#ExoqkgDhP?xMJDnDO!O zx9t1PLyp7Mmzs>EB46mtR+q2f+yczL!P5Ui^yU$G6D(*Pf6n_Ndp&4vDL9{gpBS>x(%rEsD)B-d^^T7t#zUYm-nMy2zw9H- z$*we&8=hTJzlZC&={PHbTuS4{nwj4-Oe+d}zMo9F+i;&|@^J>$Uj#e~jlKGO?R5?v z4dqjM*Zu8_1m|=^pF^Bn?l>K^2GJ$L{8(qfkPdOGrCyxRBgjji=zxUTKYAzekgh12u18)sRG=8H?*CT_EHa z6+uU{vg#ax8ihwRu;E!Lj!;7>E6R|wSy0_xxqnIt~wt8CX@PZgN{EE$Ti?m$Dje}bIo z8QrPDsJ@@JOr6Chf{Or3%??>UW&M;jYl^KTx>V`?-_9@F9O3-`3loiUw>4RXqJE+2 z+&~abe03#iz3GyrOxs)>eIOvZuHNnO5)q9MK+n?B)@*8SwI$SAWac8GgFB1n0(KQu*&48e=WY_;;M znEx|?ewc)xV%m%xbC}KEzWEV0am;=D{|Q;^dI6ah*X5{>_M#>->B!%GP(@&}^% z2|8pBK>XM^Ii1W4k*+Sc9nY^1xWZyv=^4}2ea;Bdi9#NXnEyI|-3ip|?lmZ3GaC$z zWtp<-?cvP+A&NHa5?H`BE&2MS0|ws($QDh((!U_8pZPbf1QRKqi**<-2TpABkHgl5 z+>^eguE`beb9B;mAIR^UUMt)}nk=e2@k`aHtn!$$G{g%nRaGg;&6pM*XaLJaS$;YekglBLyK3c6v+r_U>Y7_TKSyXg zq4DrdC|4I+O{Tzz>S5+F7`w^iz_L#OTx0xZ&OJ=X(hdMwS@ho6{UsiF1-a0- zX2n0FV`*Pr9dJEP#M(T`rc*8sk8tryaXHRW(gy$h>GGUN=aH#GgqZxEH-?J zEDnX4ge&)DRQ53JL}4iO|JQ=86zN*(Df-lz1xH~n?vwhpfCd7Hgw z76#q+>Giec46R`Jzq6xb03!nf^p<%wTmyy8*&h;0RL#cO-J^&PTn77#y>&o~Kii+^ z`EhM+Ete6Jk7ZKR;y<3sQQ_PMbzE1deIrFf;{VIMb&3DEbbZ};R)?S=61Uc0975?= zyDx&v4m*$FDj_9jn9M!A0W+jUC0F8^rJNNt_w@8s54I8E-|MCi(6}D__wqkksUeG$ z2Kd0ozpH6I{cc5V4q+v!3j49gQ25_ z<0ic$@;U#QGfY-WmsVC*#_8CB$68^WH!|(q|E^4cKcGuYOS^Mlnu-5LTdd}0r(b{a zR&h(naA->s{6ydP#sXu@{HIU|M5*EAO-uQb?mtZ7`Seo+kc)-K2E*hfxtP;$KOAVv zk2b$qmWMeBj7E=4yD}G+#K6D^IIt*E!UuQTky61 zFU7FutZR#Vn_2`T*y3}$RCU%6 zwP9}-FbaC^DmMsQcdmZUvF9UYLJi_}r5_#{j2zxuUH`v#LAGI!o_2Sqn~zb^XObvC zpe5H@IjC>)e#>b`5C*{T`Q8rohAiUSS7uI5)t8cpS|{8_qzA09j>Azje+_W6%Gy#Lsmvg4G!)N820-B84>n;A==l5gQJ9#m6A~R zNht1& zP-;+GnpaxSex>I0OCSGhZJItjn{aRt@B6yJw$b#LJ<*HI!4yte`awb0u@vvNEG3>4 zbl263OrE_@YkMN?Ys#t`1U)H?5%HNtAwP>3ho?Vd1CgnMU=Lz(d@%0k97Y2;vBvy& z-GC_S2raR6VEcrDnJ)0$^Xcxh-)ecW&A@1X$iE?6Xc4URKNuq@KKE1p*xw9SZWCiA z;eU3r0D(Z^&o@(3U1hH)z@M%nW(J9VEJ zKUbba9DFy4bn3Y5uay07?NmLyDrUrp2THO$$jts*!gFQ%X`Y9r6#69)#>U1*EyjqP zd%w1N0c&yGsN!P#P9rBRP9nQQ*h)$voZSK@_jzzM%2Oms3l^;(p`6<%- zV}{m7@zfC0&p9 zKaId1{Bc#(5QPscZ@!~564kJk|?W1T$%TQ?8oHSOQc1cIjX%gaww5*U=l?p99y_fRAa z2vOPp!soBVq@bw?)`%Q4S!2*}c@7%O$3mrt&*OW|9nXMx=)}^}!yeIB`6PT@pZTBv zh8$7aTUN=f)4cQRUCa;}zM!5EoZIxuKlx}UX@du- zSzenDS5W>1f#1PYKEH*fWx&MqEY2?+Dv-UseY^j5oV0(X!-{3h;3$fxyznp(@4xY~ z_+lL@}ni%X6=PDy_uT zieOdK8$?(q*c_T`e~yY#%oMr91gV~rPKa#60kbD6@9*zVNnGkx?EY!bgsBV{Y^JU9 z1zSssdMU>LGWU=eSLy>W2$z?acjYGQ<&FZ2s3#E+f`jv)bX+7_VXz$xn;O2$QHymd z^Lto&d1`!od=w^~c(;k`R%zZBd2llTfTXk8E5yqGXB<7Oq-<4;5u0(w5)0^P)D}NN zaR$@bfJO)E8nqc2|K2jo5zsV?^VSMV-dt#Ootr@eu-*#cE#g*VqqrFQ9OU~ZaUz*y%kXPr5wh)oUre3@;7g$8J7eny6VyMBYy20bckkHVw>%l9Nh|GU$% zO#2qwV(A@p~kq(lE&|7Ff}vt^acSC&nOj5v5{zFYug_1cc#2w zbV*46_-jDBVr7t;1qtO#udbHXO(ikU*u&QnS}B<>oU+8dtbk{alwY84z77@$)c+=e z8vRNDg&-;7oV?ngPUhNbDgS6hWQaXAB!>}!Tf_?5 zdh>ic7#SJqd0~Z97@L(95GvEu;&HqPPb~JWH&F7wA!f9=cecvNFph9yA!W_n-A$y}-rimwk(5~OiKCI8mCw$n zc#jth`1kP-xbX=fEF9cBHmOWBnEs+hGDUp@v5|xE31G;B z0N{d!fNQ%geRLe^!60O^#lPT#s{*g4{98c@K6tx}M}8Sf==of_h)Lz){Cv0PxZL7> zVFHK1UHR{0vG{$saUga9v>tf3>!StFi#IfbVL6Q6a|REYNV71??w4x#$14iTek_Ek zA7TFrAFTQYJm&RprKFszy2NQ{ zwpK*SWtb=C=Wknyc?#BOBCuemj|=dtN(U253?YQm0O``eS7d@7M?MlNC575 zXPuHrKmmd8Qj=3bIhHj!7V0MhR`!9;{Ez2c4E(|~O+9>>z9)?&Nq>zT&Qe3;Sb5Tc z^8e6tH z|3tj5s*ay`=Op0(SQX)=7-rbZZQQOh#(5cqF*zo5{yeb-R0x;Yhh!b1Sqdgr#Hy+HpMmn^oCG^aIF zmk~&CzCpJ!4>XBjI9KodTr9Op^SmRTCgilT=DBfLPSII8c0#*PWl7bw%jfX8p%90z z)71J8-L!&uE>&S>^|o_mY)v<-6ygU^FN<@t$`G1k{f2A{tW=-C#k~i_D}o|qP-aa3 zWDavj4Z1jAyE#gMrA0%rVY*U4z>9cQb+uRr?LS<`zm0srY|ddk$Vr{}-yx!ER2i*^ zq`XO{+!~UY`DK6)Q9aic6pqaNK^lUas8X{>Bd8O!>(W$6FPE+LI-!TAoEBlt=ldd_(kpkA)mT zSzjYsun|0VN}J@gJrH+=1{evz@37X;2$Ze-_@C^+G2<5M;hHFt0PVi`(cN5NuOt%5 znPF`|wwgu?KOJkrzMwib(=_Qb2$_wLz`}H4TMyqd-+Cvt*V+CUD<}IGQaN9JZe2c0 zJno$K<^m0Q$T)u1=>_BMEJC%jskJliWzkbu{1`FuLDH*zHH}){{~tr~-?<>HZk5{d z_8*1I0(@fXqO1xB8-b8@w(0Y;1o=HG{!ww0=CSMR&5s`vOPG6S>Q~V##OVON1BL~lXH^qaj z4X{?VxDl`nDzOEvGga|6pP$w779Som7WK=3>g$W`FCB_-RrsJ3nJ(*p?2l<)0%_IL z#IFkZqJo^|w~JAV&U4wqqz1<&q?4#P);X=k(Yqa4<6Lk0K@%}kPc<5Jx3OK<{oPA5 zkXh_%{7J`wh}&6CPR=2oB7XFQ_CJ={rg4Y^sp6M&O8On!8aB(SeiO+=+dbEjXE3n; z^Ug~)Cm66Yd7ed39ZMnYHDRSNtkADTIR1N;H$Hb~p^uN$?$Ax$u#upBEx=rHGOUTkap49qKoVcoHhA5)pXqUC5h~Z)daDEtQ28^*`7s%1g9ga63|+{F&_?ACoEN^q zFAG`Pgt=~*;Uh@~K6m=m^>38nF1$+{ zKkn*(xlAO&n}+9coq`Sq(-k;qsp6}%Wdt%28(T)6SWWhluS`}I)|zf(Q9IM%et^UZ z$E5|ge)ta}gP<0rM0DsX0vezttAFk7b&VTHY>vj3@fVR>O^azC?Qq@GwRHmaYN}g} zk%|>gbfW012v!Sf;EB|J26`vWKVzruVW~0;Z$3RZIG8){(CrQ{Yb$zFz44l7->R{Q zvA@b*YXFH9|#$^inkrPw;^ zGqE%vA)VbFbM3k(Z^6JUvf)YGeY70g&p-$`EVg+xjh`bClj|Q!WPu_|0DCF{_dhjQ zXFqf$CAG3VC?f^6sezE|0EFI@gGBpw0Txj;p|@P5Y&lGY%@4RUWK5kA1dh%6c^#_w z!N7lRCM^myj8*V&=vV*?7d|7cyj^?g?j6cy}UGh(5cw7KlP0D}3a<8eG z9yDPFgTX%gWT5|N9k?Ix!T2B?bIX?cWtZV&k@eZQyV>E_w{a1~$Izc=;GsZ#RHwKWL zV(=~YZK!(k(OIenih-5ls;8;x5=;ekJor3xW<#{ngs8tpNY}kW%r^J= zkXrgFp(HFeJ2jQ8i_St{)AWCOjklVWu^jROv%{RmFf`)9!JHNSEN=5Zydo8|)kU20 z34Ad1;tRP+53ecJY0rkV^VU$mF%65wh5km)&S!;uK>MX#V>LNbHH2LX{2$y-3hlna zLzDzRGiPE2HN?b8C0^Fr&h6g)bprHC_qvz_7y0l5eS346aioWzcO4%8s01Dy-%hTY z3d~Oa66Hr_3#&oYR!cUuU8Cg*@sqAWgGEcS8bknz_;3vRlVKl!ab#x-8X>UQGgMix z(=?T+EIAV^ri2!su4X@57_RN!PjnU8EoC-SfAsja^8{}Z(BiUGNy;XV##p5tJm5)t zPX1~@VNCQdPkqRf)6}G*C1y;JwHu{23?at>>Pad5r7bq;pb~!|?t8ES;wrBt_cv`I zq;pd3N=?)U@hhGKEOMn-TlRj}5;fp4Mxb*(-O`Z97*qH;xaCm)v?)^QFHD(2ikj5W z*4fFu;-yNejI>H_6@X#E=zC_906!R--KuDjH;C`X2&&^YZld?Cym!?}G@s1*o9HQP zkiYEcE4M}`y%p{fG~7Of37?h9kJ0F#bs;>_tB@h25ypz+obVSFF0;dVnL8pAw1Y)8 zMxK3Y8DZF)a3Q*)g%E5+kg5fgk}leUHB4ea;co{#Nlh7c~W>O0#svxKRZZZ@E<*xb*c# z)sBQoTGR;31+2kMWd0UDRA9~{sCS9P3)u3F^0@I4{JG3d@sqEUHYirRB)jkzkaBwihixN+{U>x$W)&@5xQitYlzcMwL zLrtsC21J;YA}rF889yA=_iDW>+64|mADkw?*^LYjcYH41bkgNFaQHI?ga8qbds#lV zggH?vT20nvQ|1-L*|)e_yjpc%-Nrv~e~8Q3tyDh^eWOOjumaR0&Z4vPlG~9~_S51> z5YqhUL=}`riEw^zX~8{FsnXZNvG;zCjw(o7rX-y;^~{8kP2O&uMC%(B&nS{c`K7B; zW@1G%LR|Z6vZvQYg2WxKAC$JTUt2;IB$1l#C5=5JHd-a_K9Z?bfhW7-KA#T?&U-;c z$gkhzKvGABO$2{!Z=Y+x9kOC;o2W9^Ulq5Y)rNT9!0_C~?7dPgZ$w24URQhzvlG@h zknVQ)RFz2Vwew(&$m7N*NNgMcb50d~CLkvWKun&u4;=cDXyR3#6a0o4%Y!u=6o=yV za@e&naK^2`7zYc>4#&7Gi0eY+1SPyjcJ<(ZP7AbzWE%Lo$W*d&U);__EhN3LsXV4^ zChJP?^?+drJ-FaUSlG31;ta>*%I&cF@p~C_!T{FqYpR0uQxyqOIf+Z24wwm%eE-g4JnBC<02Ip~V2ARy91yT3t z!)9p7&#z97>7~-sOpj@AZ6_sE9G-lOzcl%k5$2@RWfH9kx8#Co8(LpV(NqkQ)8tkT z8TlMnTau|EKN~s=GC4BXmdsb-fXL1)2vyXhd`((1sMWn+_3JlzP^bX7bXEIzl;;;P zG7>;8&si^Y)crhe_zv%5^;Atr)V7ssh=3*#c7R4aHp_hVy+~)8cRp4d85>nN@UKhj zg>Yy~#r3``*0cC%$ljeYEBu2k2%B5;GIqrMNHBggEKL|IbsphWia;v%CUuAqxW*3~ z<}=WVgpE;)uY?A)8X@`ztROTrm8j6SMIBoa`-u&xNJG5ny8_AEci|szdR;jMY1n#w z=lzo(XWtd;>%dZ`z?%VK%@J6>#u=^2mkuYq2gUidh8ihXAoH#%RnI4M#j2lA4g**c zqzTD zPt{|Nu5bLn|2Kpqm)diE&a*p)rkvxxk)(R`8)x!+`Hq+BOP4o;j0=Rk1?cp!oug9} zCyh&jR1JzfGfbgAt@7qej8%~_X4u+pL-|*2@#Z8buvmL8JM`9$$a4SuLkKqBrok8r zVR2EBQBmyhnU4r#Ryt2|VXt;PSd8P$o2f#86r_6jy2mNI^5b_Y*m2k9R--PIEBN;W zBz_IF`blIOotOcqsbWOcvx4qksi3*k-Q~`3`Qpasf`)Lpq+O%%P`{MJbw2vG zzs{jvC^DH2jU!@de2#pH&DSM!B^cUJWZ|i)A(?j5hgVHaN2`^y1}$DCubbZrIaO4W z^y@r0)d>@gfvGRPd*K_YC1UZMPjNcBASMDVH{#>UKwx`#NCqZb;KhGFZ3-a$cd1x>$E~=f4{n^Ws(_=2GR@@b; ztE(@-##RdWd11Fd`rSWT{Y_;oOOsvv!j2ar%3xiTTaNXc)<{3t@2-FGA&sH1nv}y2 zRZoHAtMZg<$f;C#v-Df=bG5$2k==gR%dx|(9I>I70pE%LgThE!`pyuZ(R+>ckLoE& z=A3$rc~^lCL5VAD$G4kh-LUiF+XME8-t|h1q&!TDrH`#oi(7ZFY>69;2O_>6Le8NS z@_WWEO~UEybaZrkuWw;lK5`8WNldHw>7R0O5r9|popgWoNY!&k1OgnNH1=;fe^1zn z>T?je93mE}EF`vXl~9yJwss%@;ptEkZbu}(@ldgX(N1x3I8GM^j`|lZCAZB2>1)&8 zbia~DE9N1HtKDjICCzoW?L7a=qYy6+B3Ba&jt{ zoIlUjexPwgU}va{_|y?Bd9-}x7)uMr`VQzWL|2sDW}TXzzUrCYe3(Bhqe*faQp+pu zRU*di#f|=-)IkEIxdS<+Vxr{Zxb>tpTVD*8&(93pE)i?jxV3fezUW_o07b|5lf3N*_ zU*oQQ;CNYUq=a1&Z^h7^SksQrdSc8Rce|#s|G&T0DoAxzxtmW3Oh}{C78pq8D)&(G%nF1jqL>D z^B(vaqOVi6sSp21;kMtuE0ol>dUe?z1M_0A)ip*@xUu2IDz7k>on^Tkz(NSt2A0B< zpDUJVf}FZ^_koZTD`x@G*AlRdQ=r$m*{wyZ3emf45DLWT{<&jao$KU6CK@2~YA>qH z!0)VgrNP#piMdeO!>sIW`JAwPfQ{?Nbfqt#nV>)UUOYM{3CEKDK>8Y8bG2r8Zq-!) zo*3jWLV~d4DRYX^R(uYn37fOG>f2_6%AcT71E=>UU=2i;BjnB=nqYv2=7OrUbItp< zGBmbPeTm1LYdot{vJOjj;qkH+GCXp|MKO|Kl)Yie4$m9%-j58r)cvxgKf@++juW_H zjLBZ(S91;L4@eKRm5(@{pTSYZ2N8moo#v0sq7atae7~L~vz@EbB`lSa?(H3YGf}MC zHX<&4QFqufIk`IhjV@O1TY0t3jH=T}V;v6_E;EWgmq+-jm3vd) zc;yIGGx38@ytB_PLtG4liW$8d`LS7!Ap>fPmFww;L)s6ueNIm+V<5jSZQf2(3sN)z z2h8y?sy$C;6b`&rKBAv7TrZqgI@wk`{@tDvmhaxB8yIS9-_r5$8_}1Oo_5&JluP&E z7&$>%Z>at_PUz!M^FzGYwf3lQBHC2=+ty5POJeDVg2>o}*8JyK_1Y)AAugR4g^On! z{WsD*)H2z?(=0Fo@qC@l&rA1b&gd~p6uCL2I$4;aoH_NX4?1ugtup(ttv`w-rHrgExeO;fz7js7QsTDP` zp$B+1J+5D5whGueHe2|9sOU>1_Tv38m#7&7C0R;+;FG?&ghNJ#3!HL~KP|kz49|mC zx6{b4e#Qp7u&rook)AE>DcNn$kuWhPjs$VE5bvxLKrv64Ka?}G?VY3^vVw{k$#7*g zJXO`QdDmWcQDlAj2vK+JXIsZF8-4i;b0OKkiFPUR+BB_{V7c^1i~1?M`#`G4^#h;d zk5N<-aYU3-!aDSO1zW|9-r7Pmgsu>7PNr_iGCGA1BGBsOZAWLH!;#oZFqt%bk>l~S z7>iqUE(n$Tyw*3%zT#C;$)QXO~$wO;3t;OSUX>I z>EV*2cj^G;uC5l=k@3Oz{;60C{uDwFfdbRhkS8)xui8co-l$jaZm^_C*^FmoXI{`q zGO$mIns4T|;^YCHTP?+sCq;txSQZ8owygNtlt?Xdg8d)k&;RuTK#3iUR+x~4cuqHy zQfkhK!{Hm>>p7}Ut*L=UZ8AiZGytq(%!)0qMM-zgjdx(G`2@5uHzbbnZn=vy>LM$J z#)h3Hk9iSt_n}yKU{49Cl`#n4hD3#Och^#>eve5S?$>_cruS)x zt?PRCEykU6?cq@NNMx0sjotpTTv29rNUS$CvLhGO&~J~2OEsv(Q=Eq!q^5wQa)vIB)F6(ejP@< zGh#%jgh(0cMy`E{a#<32>Hm=5;*fmYM}+c}+$d{TX}he)M8WG)w%v!l48P!cXy*`G z$D9U^p>n?# zGZNm?+hMUo3bJqI$HFUtt(MK{^NMf##8hb>Hbf-$VO5#*qdzgler9%-6KA0>dfaHX zgd>q`6+J&FM`Ip1n&BuIQ>exH?=M6VM`cBxo-29wiHJCzPw7AS_%vzm$gARO5=BIT zsfWkjV7@OsXLo!5Ode}2XRF6I$dd4SR1^hYJFOFE@P^&Mt3dz~FI)pEDP z?7-j=Jqdlp2e-=n*;iCl;lP(n@XXB}cTN77*<@<0SH=Bfbf|mCqqUh^q^Tt}0)XZh zgTOPxR}D;J{$A284eyb3q5iO7f4otLFTG)6hD+qq=f{kf8ozS8gP%#F8}G1@&Od*2=1*ULNYE%g`TtyI}DV}61H{ho&o7EfVW!7c}N4f+LwL8tEW zfCH!y+n3^x*gG-G9+x&-YVRj*avk4;BrVHnbXb=qJ=^?<40x9XCd)g+D7V80 zs13m)XrY?=(J>>LTxG|8g(l>f2EI(I!mTQJnmv-raHRg^{)VUTu{}?Otfp2KNz3Pc zaTt8kbm;F*<~5>S1gS6(mI?2eOxk)AzMAI(|FM(w_PDF)PzfmbeTEzzZgd&=cmEc`(07jnu{;FtwS(Xz|i!zmVt?MGCJ%yoL3n%uoJ_+y8^MNfDZgBRlacHPNr6#B&1PO5h~k9@g>E=mnnu7q6ac@-5xPqjE~3pEa)Q*2`&%lm>90KL01L&ca!%WiQim zK)Jutc}eyXE67yZ1cfc3>dEVD7GdBltsd>=bdj5tb!Z~2V3j;2U(GL_R(DS$DE;@CC}SHMjgVpZo<%gQv+6~LBeyU2I(y6J8wL3PI` z6qRkxKqctnd|GkEA!Hnal}HE@w4nYTx?Sg)ancK|>j_$OyT01mQYP(sAYTbQZFPbl z&pLYV`C>GMo9hcAWQT3tfgf3W->hychq$0^Pi z08>T;lL6(wq;EIuu*WO?wDaWli(#=t2G6I`=BtKZ{7f8^EX0ek%3|K1qb-CWRA z@xA`E?AGmVZ&n)^l!zJ%@yg};LrPl}_Uq?@b0eOP-S+wc`Q`PMZMhVK8yUXNs`Im% zJglI?zhg__AoAzOcRHOB73jUSE#5ln-q4&)^m-MNr}0CaW}`h_PNG%L7e8_W`gdO^ zaF0h+YsB!WR2Y_goQJo3o%h67E8cyx^0d|Jk>ysm!ugbOpm7#`kf5-3a#@1DEMzOE z&U6UN+81Pskvi0KL^4mY$5@6RN6BFHed}NbJ@m7AHYN3I=QSxBO)h+UzwraeUXx*g z5R>!>rOkDvoZ(Y=cVI#lZWJ{P$k`d0+-&M~^#1C4B*+`YY>-Y_)1YrOIY=RE<$RfO z-c*q3L~O3F&h@C+vU}mJsv2)USO;;PR@K4w7$6cJWVHBQe+jO#@04tQd$ziE)LHJy zpWSR2wH-W34z!uXYj|6{vu}SPr6bUiYd(>ZD-{%4_KH9ki+8h6{Iv5Lk1g?NEoIl*1eh(_Mqbl!tjU;)yjs3c{>INpV@KBP6B4T@9r z)Mp9;YDd?x2{H2U5OB0msqJ|*L0|E8A~%$T`lPDweUa1=K0Q$_LoZ(~KXu`hy2PcB zp8kol(^^BCS?{=ezkomepw2LNDh<~3Q4i=`N5*|}Y8n^JPtP#88vbCTu;^wTp_~^V zhcPv?evM%Ev)40qC|=6QSr~y&KXBiK%FL{I-@~2kkd^(Se2-l|(RrFZdmx$wO*4Ul z#g5ITP()aG$(cdXQdzr)NXaTi)u@zDJvFOfCr~w)l-f8*Wn$U>O^OH-l2#D<9P~k!9N~94uH^%B>OCbQ`0`dLL&~4b)`;~kLRYL#`5nd6e33%b zao@Vt+~OlRvR7TdV;z*?vGY80Z_P@(A0_zSH@rKVMkt&^HK{|@k3t{4ek%?3M{FU{>HTp{^!*>B5Y8$a?>zXQJmyeK=4S6}aF;5-a<_F+Z zTy{vePzW+x z_N+jNQ%%?ne~tTA!V)GmrR$c$H*(_kyrEBAyP<<;U<$H?!;6rc$qD{IL1Q>xvsJDP zN)siQDqZf$4rdyE}Bre)_5lCCKXp`TLYh{mZ|kae2zv!>REq` zoJxq|!P8IlY0I9;WPKknp$?Idnb@n7{vbyF#zmFyXuptgTsKy{H~Ef8rPV}HPNXUh z8%p^F3m1Hnb^$JLzpFLWz{h=9cYvFFt^LX?9pQmD zGB>`67w$3=5*l3&XavkU%_SJe$Zj{C3_+h`QD<^t)xkUdQru|AP3qxk#~Py*Lrhzf zXlX(+bc$bAT{7Cl*h}ayqO9s+f22WRf7XoDs9+E{IWsNfCs=H|;EwZ0@%|sI?4QjP z(o4RT%|Fqa$2@W>8Hzp`$V6yINN8gNArTdYK`W2Karo-GoTcFMis+9zie zbkSLiLKu#Lw~AX>t&y1vji&hy2wnc3>V=`CS@*W@c_Y1#z-6ORj+}>utnltUIfW`# zW1!JEhuC_##L2p$JcU1!^1&+5uLkoXQ>a^H%*&xH{sa*qsyY9r$2^Mpy)K z?}H2~TfeR^oBefV;@O_<@JVdM59x4RI-6DGbz$EA%H5ow$*DZoS5BU=OxDAaDso^L zy8tYYR90Oi3Dd*P=FvMp==sH2W@GSKKNI>TV&Lt{m+JX5xz}%-AGQEGLAkw11To|S zkQjE>zQ?a6T&IW7G4kd18~jXLtC*I8w{;AQ)Op|c#_NoO5$Mw0|M=e1z!PxJXT^Rp zFv{+bRFKr;^wgfkc2@)IH7PRa0)}|?!jB}SXb3eKAA@lqkaluVJF4=cRNL=sQQi+$*I@)!JJ8U=zxY=kHjy8SR(0t?bK^cE(ekKM>vFDh)%azxfp+SFycuUBi*Ors)z?|RvXQZEefsbC>Q9RD4 zbC8TxPQ6?6i!PMShps;0mM8{AjB%*Giu*n%~FvE@~C@uXfy423A5| z*@*led}Uo1PLSKz{Xr1?lYH;9KErt2g4$#C*YMR>a#DORZ>?w867ZJ2-mnZj|Kjr- zcc`wQ_?Y3<_Un6}%%T8=g$hsf@mq?X47+#8Gh2<%bwd|Tz-U>`iuCUxIrGd9%{K6N z8Fd4;qgQ}n$8V{z%9e`o%ZYu?uA@Z#qim9Wio$!UxyBZ_FGxF;WaS+uc}jK1btvhf zyxgQeUG}5ErtaAw`ggPHLj`71K^W-?rc%A{IfIg-J+!Nin-UGu9ZtjTlwS@AvL(5( zA~JLH9pCqkC1l(#KrAafE{yfAs^`ue0|dV|C7u|Izi2g&nY^TA4)}Wq=_1H|`_;vh zcjU5j1pj!_7u;YyiN9SKv-Vj%d81z%pwzp22-t|?1RS1b&~YwUdYqd7>Ub=O%A4ot8a6>4Fg7?^XSUSi zhU=~+%c{Wt$|`Qj47cU%eN9)-w#z-`%@5fuLXKCk#xloEBYopZe}(Oq>L!H>=dZ>e z7$e$@nhaJ~Xg2)k85zFzdAUN9X$_kV*ttW~tavuqoN+A-19W$iYr1kk!u`*jSqYzv zXKT$MEvvdzCCYBgHB-GNy$xU{@#*lb0$6yggw_>pwBKH-Cmcec!E2ZR6t-R z!G+8wNyZj)TGe-VcAH7hgbb_U9u!At(XY)UY+z~*pokwFX+Z(>_*eVtb%eW6kI z($L#4fb?T@2vWu;iAM`9(_0GSAjEPvuQ#FUh`8aN?SAGcC%)q%d1*vr@oBrgG;{1d zdmQOp+V=fto-5$oB=GDqpUPQq``m{5-axialG144T15brq()JNE3IDL0xZC|@wWYx zYyD6JYtj?W6kH+ysh0o!4Fz@0$lzE72# zBJ{EneF6&>4X>S1H4OslV@xaYu{2qamiz1hC|LJVfa>7H@R7-7AqR(~tzeC^GN_3r zf-;LE(M+HBF_DJeq;t){<`v`ZIze?8+J!MGn{t~6Vkk+dXJjPOM(o{;yd{Q1yu_FH z<-1!v$ZSGQ-5(rH1CZxE>qxNLr^3b`D>1d69^L)?4yo+CuHU>BMna^+2%K1t<1eI+ z1|Zz_x?eawRGECdQI%F#xxcKsa2k(T2<#e*P3H{M_}*2H8fP`U5x2t1Q#B2%ST7gh zv6>Yj?u6S}PfX^VUIZd3r`31{ium2S<>iWUzo3N(=$tUJ%-#n!gk15Nmyc6?aFPv< z&CvibAQ&Y4P{H|?KvG`W(IlKHETP$`?J*>qFa!NlTJ@v}9?BR}Vk#>k-t#UtOd8q_ z%0zJtPbjLnz1Ow=!wXJPlN2Qvv;^zV3*A08!KsufsZgO3OKrej*0o%^^4V9MP)A0!+HgT z&O-5;ge@vYeb`BbAVDtaRNr!5apuxvtfby_4MgZ%|%lk^{}o4AI?d;IzhBI{rlTusw={ zxn2(!eAu%h{$quM;sx5D=uC7t65w(nI^LN+=c18EH4B;3NYN&eBxUo-LVI=WSP0*+ zcV&vVT8OQ_d^bgPiHPAqn+v0|Hs3z8JnwWZu#75xA4k*(Vkq5%4wGv`&07K%d#8AjG7*4QbW#`R~+a}42Rj&={->}K(xoq@)M7k%bM-H zx1C?O6R2@lxSq5tQAaYGFc8}W7DQa#w{N-C1i7Z6qq4yQt&0fmvsTYB;<>g+LLBCc z_2%7NRt`~2X~@^pHb2tNSfR~X_OwJo9OX!j1V8c}Qt7`&K`!KmXy^~cNZ)^J`153s z)Ce%#sf|!g_Usz1KcTx>0z?L{&Dv&_rZj zS6>T7hx2|f%u?>gyq_6(po~RYgZ($K-g;VwN%nEg1Q1#Exm*K^aC)Of1gWX0#dlc| zhbDb1*~=TpC#jVspc!#MO6nWv?t-_Mw72ZZg5p<@`3koMMVUq%*_#`=culbWWMA_nv@`_oA}{G z{&{yI`v+Lm6L>vweFiQ5Rb;}LHAZula9`Dk1%3me+2{ard+Fmrr8hoEKbX(ghU?Ivpq2tc7F-HqoUm;Ycf!bd73VT6 zt?}B^f*W58LX+;{LhOB#30U)}eV<8#RsICs&QX;MLd9|GCNfsa zXzp%>c{nM}xwJw|BB#3IB9*obI;?nKQW@l%Ea;#~CxA3;H81Eeo9ZTV$`!OFOiopG z*_@qC%|BdNo(XZs3K`d;`WzPAh|G%ul3uhLKAw;*Ik%Iu%$arF}Fw(Z_k4&eed5o zDO8nU?qNXh-)15)($1EV4p|}uY#|9N2VJbnWYgihD|DS6YkeUctFy&I2zkC>Mh*tX z)g7G9X=G!&;mF^V1$|NmGU7g5_Fl-xp12#Z1Gw33b}|Z%t8hOjO!g*5xlnqzgnic6 zkR53YOhkWB#o6;$Pi>$qa<(#0y`n!Y%&2JLmbLI$Y?)s++3cDso@!R2F}iSHixw;6 z^j>z$aVlHml)Y@Q-X--+5Ybf161EirK05RAx$dO7sERc+PKC)7$wr=!aR&YI+V&0Z zfS25dKzY7Vwf@i=n-r(vnU2wrN8`dJ_Q!J2Qwu7!1#C8-rbKxs@Z{4Va@CPMr7~Z{ z=6QdyU41ur-PY!8fYXBbAg9u2MtmdT_7EQ3hGM@b=~_s+v=G$)Z`) zdt)<7m|L!(qS)xUEs3ke-Ui2GZu}i{oAS580Mlr|C*#sRE$BeJn2lA%P-L`0G1xEU zS+KZ7Ve7^hdi>oLy1B;@xuj1`%09=&+(Y4L81!V=g#6I%M)mCSK)qeyO?^Dcf^H4F zN7*W4=IMR&6=-&U?5T-wb_*Sw@+-CX>C&O9kpc#9KNtw|v`KXfedL+0+}njfOXY{U zrV>Y-x8lr8G*WWumc@;!2S^?P1)B8BB#}+nep*C0mxB2*pxsy}Y(l##-dTUR*qt75cw< z2+?F+j>x6|XzQDg2uLK$!SJA|c2$Z=czr~~U%HRg+R^hXB#r%7`nwp9?*lom&?AvY zC>r60V(*4oeq}LcCuI$hJiF~!JP{Cr^W=(JHFY-M&fe+E!T5GJ14;$dupr3GE%ls` z<*7lh&7}1-RxJRpyfX&iTYwlMW)Ls~f8{s&c6_t{a!V-*}O0RC1)+w;Lv zZeri(3%)rzCQ(ebLiMdD+Br|<)1Ul?ya6&yS6Jtfb4yf@MYEor{}>%!$xPL#l3b+i z&E_~OOVNt+q{XpxOTznVlZA{Ed}l?wYveO_VOfv#*rcu!zC1bNJ#~EWNR!}3h%?Wm z{jvj8q(!|+mplPPZ-bEov3IqB-D3UfmPL3|W)R7;8;XDptGROh{v#@F6=yOGYk=wO z+SIdaa>ua%n026I^4~~(_u@lk>znGDc6mfOX!l|qyOv%gJYZ?|JVHh!{X&F*H`VjO1738rPWmy+DB}%WcP+m`lg8B1lln zK)i^{Eg*SGJ{_F6OYXYNn)7F3sEYdWIkmUJef77@`Jxvon~ge2E*aaMwZUVV3(m8> zEK`A5LCVzZo6TF?L-uTqz5&3%dASlM%@BWs(^20^cp?~0r5RRiPG3)RpX+18#9N-}`C;%douNg2wR8qjDKof>V`xn2z4Qe@EJS-Neg!xi0j2`6%N(SGE(sh)jKbe*Up*g)*qqO%<3!+vNh}j%2`B+qm+n zxNQ;9<86mK)fOOjWkp`FKEdo_0oqILP=k$;BTg_?%?T*tMCJrTX+~Lo@l!3&#+F3n z-DG(wBD2}I?uM}nrHFB~c@Nt8d9A`4!)l0^lxt12Tu93tQvfxk2>0C$YAv!HXDCiNAJ#4tWJ)*Ij}POvSMmC zjdZaPFW>YI83C6`+mQ&B2Rk2zBb-)Bm=bHkX$fjWhM0bByH*d0q)N24%nS3m3OUnS zEXScV*g4m%aH_hH=mp^d)8CZKZuQ&qGn~ks@%pheEAws@%yG+5XK=h?5>lLP6T%eRwt8!anDfuMn4i@Uo9mjrj$#oc9b2@u@fJrHzpcX!Vc z2oAyB-QVSYzU%wJAGT+zx~qG7y5^iyiUn;7Ayam^v9fe@;s6T$*nnQ!uAAz_%ZurJ zLI&Vo96N3qc0#Xsr1Y%U_|F>euVW4v3F%(0l94+)Y*60Jn6zz9B9w&ir!EaGMN6dY zo1;G#&;?RBQ^agQ)0f#CM;YF0w~H@J3MFIVv6%CGUExA)keRd2cc6~Azm~vhQA{0^ z>~PuW&#s!B4R=`SAD7m;s;@F5INYEk`(I|(Ca?Mpge2lFY*5GM3?+E3nQ$rKaV`S02k-Fb^9yz$#igNfCh>uEzG1lMav zyXzU})DJ<}VDL?`7YR=oFz_Ece^0>Jg;+{9Mde^QJ)(UeqUjsL*qyXDES}0gNkJx+DznfV8c0r(Feoc*^>=XR`^O37?B@>|!vSQ4MXofF`Z6tyvFhGZ zGAb6Ibu}oZ;w|(67-(+64gU!V^vfn^iNfp7o4DgS@eT%&%fe{$FmaG8K(RV4o-2^) znJ+&oyff__4n?c7zv(z2eEYI2vI5C((MG9a%1SbGmPM?|K30j(wX2!0odyG6{s$wa zOgp{^DO~CeCEeX#3eC(^HI*hsF4_(|L!0QppsGg!)!WX4V3<~J#KSpVt~NST33{b9 zO+8I<=}GB6N{;2zLBBf1&*1f^;79VAVe@B31*q>5zrldR7V1auFWGS>jYdN;f#l?} z78biXLEH=jS{eyN3+p}YjJtfmNw=%b@aLQ0)Yo$*4!*~Lk8ld%JV1eX&EA+4*`nRW znbEDH;^H>J*~jjInUNO4$f}3&mL>1>OyHC~FN(S*KSuXg+8~`K z!fxo>Wl!ydGMiaMPA-nVcuy)zcKShRQXHftMLldhKM7eT;oUNIt zsfBJusisza@)yIWfH4htn$ZfbNr)gAOufn+-~URq`0@ zsDGB|`GbOf!v4ZkKNo*j>GKCZ>RbO_{E18WMYIfYUt|n?pLl#KC9>=<#QHe_VO(Z! zn|eKf9Lf=lJ2y@lhGu*~Gou2uHe2#}(zS$FE7Qlusb{qkei-Q5F(ksBQ$>RXgbuj| zKcux^s=dv$BxUd16{QAnUL0{>FOTSg)GkFs1M)tfc%Hz58;Sm?R*BKW;{`+MH}NoX z;vfKhFhQu6gq__n=*C{9W}rWN9ok#53h9o`6v{C;IWMS+hAB)MRc(3rrl7*luPG!7 z)WE{TCYectQPYO0!@{$Kl6L08hbL(qZISHkY`O25q)r^|TIy`-OY=}hg%Y0&cle9D zgVaFmi!V&m^TTI8uZhSL46}TPy9uGErvXPPmEmf6MaDchB=%?Grwzf&`2EYpm1yaS zR@Yp?lmnkQ)3k;&DpSsJzB!FnO4DJcL?9G!JlP+`sxwT_VUNqLTBu@{-9DmC<)B1A zeOwDME{=5LP{Ywqd*bT(em9}YR>ms3R04qngw2yr2GN!wzj$)~$Ru8jH0b>PF*^Hs z)BbEfMqdE>{mTAfR-cgPPla7iS;z`~Pmi$(8xhm1*SgDA;UnQnlXU+b8oNKC*f>59 zA_%#HT7h_()UZ5uQxLkAhoz1w$#UfB zF;6(A-E$zm!j`F0h-*ET`Mu*%@PI%;IK@^{Nb_g5VL|FXgk}Va(h%*94X;qmI^gC% zjHJ>a)dWQwmbhYd^j7N|opt)2d1Rk9J&?9Ay#aufs5jxxUJrCkaJ+5_uz(!Q|$p;l3wkQ_lWd!$j#0m((YL;%s+yml`O@oehzrZ%k8`tb(vtQsE43r{iQM5YRb>*>er&u@l?Klhu=Fji)*$_m?cffu}jb(<3(#ER#Yi4 zeADk??JnrIA0i{8bhSz@^qa_EG%^x3V|Mfd40HWm*lT99>%^q0g$?Y{GxuS|BS?0j z@17E>#jT5EhYwCcmlcrxCPBn_T^`8>{-y>IX244R&Ba(BgaQ+_{)>DmOEbxT?YrT7 zX1bA0h#cwh@$ppA_+&=kN6$Im`qm8wJ0N35VZ`C@5s{6aapx8L_-QGB+cC>E_XM8t zR%&Ha=%arGfZ3#X^7D5VOpAj85%-v>!L0PHZKunJbUbSk7W3rGm@r146t2|%0W-6f zyL~2P<+MyTYRO1)gWJ;eTaP5m+lUwK){uOD;FT>4G$#vX$;Ar6Br^E2J z7;uO9)h&h$9E@K^$6DX zp$R$Py9m5M2GX*&6|eh@kOc)-juA*~pf2Sgm2$;e{MKT^`5E5q zSjDz5(3>zrsSlLzWPsntty8ruO^M;$U>t9~Y*JBZMI`HI9`8hVPyH}BG0SBy43Ges z6*ML<{`<&ogJL}^p7K6OJjI0Chc*3Ox-ZLL^^|}6iY$Hi)6(oSkbJ7HXyuIsEjQ2d zn3RhRMq7h6+}w7TkJIhtBwcB1<7x~C zi0b9JaVCVNn0zpASqR2dU<}|~NPNc4OkHl&-$-Q?ko(yA>PaYe~jYef8mqu|RndQ!(mO4PY5J4U<9 z#(Or94&-gOtovHF7d^gw7lZIiKzZTX_BmVX}~%_P>On67noX|ElQVSy>G|c_HoX z5sr}iQAUcT5}&=^S5GJ`LsMw-lElcElM)^&<20D;T*!jkOM=R2Vs4LLhN>;=z<#=n zTPpWe<4Q#oSFGWCRH3m%Iw9wr*1W>%3f1N}Mh)&5wr?)&TVtmaUVZLED1V2;Hyo)J z!Y^4LD@%RlS1HHh=SBrY`&!I#Wuy_chb7Ov%)}aaC4;wRP^4=T>syhEUI|<%kqdT~6%<-+i zfrb438_JmrpDqMPb&r=pFvxhasu4TUmI-=Ek`r(nBM-f8e1s-Qs|vkHP`;^UdNBGg zjip9HT-gPRHS`&EOv0FxRdh?`x_@f)iNmJ9QwJdb*mh#mrGkUhL?p%C?0f+UaSn#a@D(g z{gagcQ=xczv#A?%N>Ua9(v=@e?w~XLr1iZ@{WKdm!a&du#qawu3UTK#%y@dj{;>U` zPZ1``!}0s8>oLOu#|@k(D+6R^Ar^RU1J*AG&)?Js%8D1ym(ShWA=A-2CqHjqo=|cD zwe_~vT+9q3qK&Uve^|DmdWJKX3$Il==3B!@kW4QB;f9(&R&jZ|C;rHx zvF`Q_nQl!;$`}~}{HQbh2ak0nOzXo%$NCz~4?RjA*ySi0YJFuJXDs_xLX3PYB-nMe zpzSB}E%S%7e;h+*lSz&j+Uw@%Q%n5b=PYQ)gLV#dJ&&pK-^?>OFn%Mk?Z;` zKvrnV03+7o8Nc&kguV0Lr%sHE`q;4K@Gpj>D!Ljfn&60h(;h%rCyE)JMaH%gf~!Mj zcZ5U{wwsv?Rnm@#0x(a>aZ#p6oR}NvnCrEYwUP>m54T|hk&TSu2pDN~6cNbWRH$}; z5^@j4oR~|ittF!^q|CxhDG_tF#zv7xHWJ%AIQTVISD%f-a*x(L*(ttTTWH0JuFylE z3w%f(MW%d}M5|u^<3V>!zBw@Tz(T|G`?YsX-W6qSZ$7lvj|=VeLo6v;4~9 zW@;68J|)X1G(B#Tx{Gl%S0~J&SdulI6N4{F(?lTVQu_L3JCSxeGQNtCAP~wFnR%T! z5|cm^G@c@5SV-2Mb_6)3?7Ijk75LcFMR{Pb+ipAbFuD?x!W;cCX#aHR)6iV^KqYVJ zpLbPr#Bz-8>!YNn{8K{QYwuK9lpaf4a^Vj3nd6ehwtk)LaXEnL)0h*{^q?<+!N#i7=v*{^-P;r|SR`B^6K@ecm!guT9Qb|AI zxVckHsQ6uz8kY3#Cu0OAnel=bV)d&Z?6md6bJ3?U7(g-Cf>lx|&AKPF@kmls(prNR zfZge$i5D(i5mmOFzO|w{70g=m8Kk+-<;Gg`8xFny68S9Kmq3=YPEQ4epZR6dAuUK$Ruv@T1T}JL@hI)8eB@;Jr+LU14GH z-EXP^x6_B}Wj6>XV_E__HnCaoFY(hqAu+z~mzr(oZ9W#5omFo6-~;6r&m9xIbPZ2Q zBPfQ0_dSe?VK}!eAK7LepL9@4HXUheYq$n8R1r&BhCMnn93c32EQ@MnaB|&=1{GV| z>$L0jg-cz1DWMuuV%wc1Yv7h-DbU~F@dk@2H|(1wo{J&MjvAg!dko-tO<{7P`$H3x zn0}En!!efG?0~IgB!q5eg``)radvZrVghiQ?Tm|y%R@~d8gJ%u zg}cy}z51ICBMwHTq6{d%9FfMVe`<_;rEu?)N4n40NO`X(Db=u-i&lL^*SC7cKd#Q3x9AQaR&6wMS=3+pHY7y63xs0F2C4i&#R;dTknn_i#r!o<4(8!7hAiue%GKeUib zAMImlg%R1t?`AJ`iehPH$=9wnKt(lxF`1jx+CeGGyGLx|DU*|vNuy)a%aGVpp+*)N zS~e&Iq5EI=@Z{BI?PVlrqBh-QXc~ht>kIFOZul4^AEsER4RkoAFD|?LRpiE1fV2K~ zW9L=y2S@e?^gJ>5>^%`#+FI{GVr(=lMuw3dS7e&?MY!N*TMgz~Gbm`1h)L9GEsVs# zZwCq`OfYaqfQ6wkloFBOFmGd&J>20h<~OUvgX$onT5r3T3{rI{`VSCME}9uRjG<-CtR_QKz(aRY}45P}`6Ti~ZiZ2D9k>VG!oaj0x)9}=nirsPNRe6?}^-1Ov20$yu+ z2e&`@sVsxG&AqELG&y)MItSh`(xr*fU3rO{J@h^3omb_r>kIy^8R>UjEGNd%<>Met zusbXn<^FHcIbQpiY->7|u-t7_n zCko1rc7i<8ThTsw72D3%IR%fdz|gNPjdHyitlLb1VUj5!f&tKWrE z>0 zvciaay|S-CBhODJ)9*9*lXMYGL2;(P6qviSouZxpG}8s$Euf;Ztk4hqbROl5g=!hW zK_WW~%>Jw?s;rHWon5pNf~f8gB69`6cqqWE#=@^nHX@fn2_!%W$gBj;9UI6q7&K37JAO z+s=n`wipj>hXbJ!CA#44U{G+o$5Q&I&Q;P%wS{?9kqxu9Z{_tS(|13!JSr?+k_*1M z6HKPK!_hT=7D)&{=0YB|C*nRd#htW;AD?rz-U8`TEpbyDhcg1lWol`<1f7cDGjo=q z5>Xl`0X-0>{eaRtn^~Q>+%M+>q~g53whwo~N+MxN3>qk_czTxiE66mG_XYjunVOT9 zOBdlMh^6R~$XBdnaCgT{$Z?4$xsI7d+Xd?ur#^pp^F-r3fmd^#%FbAyh&p2SDe6k9 zs{F{Z4AP|?n2g)nJ#eHBP03mQ>1=bkf`TK(H@Lvt1t4vhPX70v@b-;lx$x3L2U~hQ zGQ90oapYHlPR56SFQD>kFoE;EAZOb><4E5?8VH%zU}t$&*ya=A^;gCVEOEqe@wMqf z+0!&fRie=`cmjCmeA?Q|Xt{c%^sAd+3^MX|Ps^ovcNf=@XW2tHmLvKD5`BmUeTX1& zZ#N>F+1@mEGi>5E%cG;AoDcLr1sZDU+zQZ>tqkyRkWOrGakH zL>oaKec*^A8ztGvCCy@uwZG?*D~#~-{%hF9#3U12vaT)LJPpH^c)f_wxKyV)MaB7& zUA>hCjWlh7_M?&eY!R>}EQ{6+*`>kh;)AC}vC2!I>jbAMthF2nDJ(uPsn6}guhaD#AQ5Tn=tB&y+#J>S~+)A`UtMf5`9QYHD&H z(+Ibm8rGt2aUJ@)e$DaiSZG~Mt5cP?XBa~=8zahf+$yhHxhvw#xeB)`qnHLMZq1$g zde-Q=g2ZJsk9x9cwsUYYK5}#Ke?cOEObPSVNfF1n%yW&@;5iP=?Z?9{@o8-_T}3NC!Mf=TetGq`pc}7yVZjt#l1++ z?kJC;g?uNW!t#yRwJ(*cMvwj_6d_CSn3k57XU}_*!mEep9?S}m4c-Gq8hG!Tc?O`E z14-*qK3xpai|Qo8LpQ03o5Rws~-@-M(T@D(t z8*KJF4_yu@+(^_H=2JI2ESrSF$0U}k8N0&E%mdheoYWAa@cw#eJtTL?L*c z)+-P5@Upt_)mupVKnzirn?y~J93D@n(cq1xmD_sB;rZ`pt(nvCaT~4=P)+`B`Dr5p zbD%74?cPqN(cy$a(LQoW;TTCZ^IzYU4^U8h5kC&Onx+CiPmb}IK5Qb>yQhu~{=`=0 z$%>Vpv<6n&Z;@ZdT3UNsa%jJ7L!=e*($FV0>I~y=IMQcZ#coaZU3*HQX5J0!(i=(- zroe(VC0TW;BB$GI7ls-Oo=}K>uM(-5=#neil1SPruZxgK$ilyShXr}75g>kkN3(-s z;kEG3c_}bTYTg)*siPDbIN5X!Pxq(AJEtSZA83yJ6musPD#($qRXr=pIF=xeZ< zWQ;nU|M*-uMUi21esJ;qETcyjc@;cv`IAkl9izg!h8}ovF(^FkMR~7JQHw&nQcbP= zdm4K<${LV6bzA?^W5=y{NiW` zg=M0;pZq9@Y4&(yHzkSWCdUz6gAcX$L%CI5vAl-*igC^)WTlcXoFWcUTY}Yg*f^s| z2JfNCcHts}K!G#8D0wG*NQ#w2>mvgY$e(Rfxp)$*VdUZBm)IkU=Bp26Re9Mi-w>Gk z`p>k=5<*kTw<%-OB0Szj=;mczSub7iv~ zQe2dKHnqx{P0b5Ui7xi?wmA3;3#%13Gjml|8a@;%KKUaBU@@7vt4ssJJk1xAgJ`SRiYY3mXZ$9&DME z3PDUWd0SX-@HXjzH(Y$&5}tmlk}eD}Ou97=>Od92ff|!o3Hunyor$QBI<{G^Mq(xh zl2f;%JBJ1rGK{Y>uvvz|h5{rBgCvaY%h2EiD$4*LgE zk(4@IHdBZX`9rSPfjiz@s@bHcINL}Bdeay4p**gknCF9@Mt_rt3Sd8&u*K=zWhh1v z==a6%qMM>(jS_Mh?fbIPHmMdCJdlKg&wpL8m#5RJCO#H0+H3Us=+dJ>2JLir1K2g~ z?2;`;z;`-$DMW*^CPMt`i!tmkD|_?>_L;S{E~Z3)QxDwVTx@5l`F#5v%fl4zRcYV2 zvnA-mw*!-iE!zGVn@QZ0x7JCST_QDh3J0JWMluUON##Dc?q%>nLyP{QeqP@U+)|#~E zBpbuK9;-1K^3C3GmIoK&3_6V9;nzQHyy7Q%jSs4JTs*HGMGG|ftRH_H+W;e_C+#lZ z?LjhtSu~f$IES_-)qYW~o$J+fHn|>>z=U~H51m9s;)Nw*Uf{4shw*{(WJ)2&w6N*@ zHjCdqMTZ}Xi=?gjLY_#Jmb-Q1V z@K>)10Q9+an$IVl+S%pk1smB3- z-rTB9Z}_r@xYEsqXDWutSTJM65L zauPU~H5~l@uqS&u5~wqz3E4mk+G-`~ple&@72L9s82==y!JNMHG!Q$jj$9l@L#T(w zU>TmvcQqaFcE9xME9vz(gi~+paov0*jBTg50huBusmJmVym0XI^iNC`Aj`rB1Mfg&J9;RmQ=D;a)J#%NYkwmh-e6^Z6*Y z>=X&RHf>S<0G8(++UY3KYn=hUVoZfk$fC;SLtFMm^y@N{WUL=<>629d?+yj~F7rG& zx=GiOgRt?+;Zz;wDm;vODP8d~|4kyN%U_aP6DBJkI?N>w|CJKAY=^sVudfvUnyPxe z6vJkkV@zXAbW-g~wiZzPk_JXneIIGh_zCJWsjC|4IdW)>Z^LSU8vi#<&9d0kaU?)w zrleY11luC_K!{ONn3S~QRQhha{%O9P_7BmaC#UCIgTI@>8(n-Jq1MO=xx2}k!fi^O zSK<2!heW)&NLQhzE59U74^K=$Qbiyn5{#S=s176G&z!{S^7JQNCQ+eb9aDKPz zAqT*>>oq?IqRgzAVmFBSw z6m!4-K1ubNSgC#N;MzY%`&0x+0n5b8OMJgRCrmvil<-h065jr#5L)iJWoY^kyI%uG z<|P{|29vV)eBkyiN0YgfIsSeZdvtsnhAw+6I;rIDvG?MedoCfbtHdhLU#eoS0LUoz zy zLG~%sdai+NxT;iMyX0XIs;J68(>2-yNe^2a-CZt zoq3HX4VC(D%+K#-iI7UQ%FsIzRE0W6T2{JK(^lt$UJsQ|GE2NRMWM(#Zk^%TZES3O zH&l9D^)|*XF11@KxrfSx2r1(xJLDmksS+PVz1zi%m!vwv@LDJclqe> zwQd$4$5fD=+^foNx6QGn1lLXT>xMTSJ~Q7J53MEtt>i!?*a(qC0@{886(?_vOud*_ z&dB8?wMK%5V~F@G^*Wzw?Z}-*IVT(k^+?}rr_WISB&a=VSouY8$j4^Q$B?BuOs=gm zVZ46@zuh2eckvMar?#m^HABZIK7K+uoB?>@VYkL{BFlMT51aQbl$61X|{t{Za?lj0){4l+P7BNJjl6D%OF#=cXVV>q3#ey+2fW3gj#> zw{ejcLW{akU}JBuslE2G%O{33K?m;ZL#u>lLz3A)n`TJ^gQq>qtU%{cJnmulzT z$tA7thH+LIol6d{e_Jh$(BA(S=bfCHWMXgjqu}o{1~~6!6Qarz#PeqvtqtVDr{-pr zl$0EkBP%~irKhB9x~pkw3e%F?6U>V>1li2^gna!fO2?n^Xl293f2Af3zE8}&)^74Az zH^j!gQuS$AjT&t|-6}HlD>5bDc9>xS=z^>WTc#wJw{mhlcpkBPXt#1ai~~8~)N08) zKELD)IXOEEuTPG_Ww}0F?O$_POwNC;(}7+}TDDxmAPUy?fY9qMlnC?bItt-2;VlI- zT9+v`clyc`ErrBI&v20uRbQc3L)*X87MCXm1L9fs%xmqdB{dh-4&R0SFoU6FGKDOK z2&pZFpc3&VA*cWHmveGBrl57w#H|{syVG3U-G%u)or101 zmP|6J>E3p$ACQt+ioCMxAxpyO#~))n*tJ_>!!z=kCl#&tJDE-RAM zTTp%+?MP8Y4zNaHpwsbwzZ*Wt$jFFZ=$s!Wq&HN4zX4V+yE#NkdB?)?-+j3y|Jx+3 zW3`Rmo*(oK3|+~`$T8!NXa9OKQy8_|)zxj&ix&FE-iF|vqkt*84#o1#4caLkGxLke z-zvW847-HS(e`ha-+dt5A4&L{X^jG=t}c;gWE7sp{%<0`GvvX0(e`+BRKI$>dJo>y&fiOYip}6t$X13 z2nYyHXPz~okyzoJ_{@Ux*4~g3vsI5arxL|d-NCe2p+dLGWGKdFK`2N~Whs!$!Pl!{ z_MgTzI{AOmco!uh!=QbH(npIPkI~?>m*dT~topWa85B^oMddqGDQ#DE6 zZq5pWP6NdiHw|V#XA@>{&vj|kh9M)IY=jL=J>zY zOfdL?+6Y;Kfmv5sC-AAr%B|+df6Yv#BjW~)aV26O$Vjrd|Ix^C?w< z!Hj@jK$g62bNoF~ z88KlKT!~T!1*}c;jGafJT!%4+s`jT$^)ij)xv63aw%fF#g)yZ6x2xfE(G1@w) z77u2o|4!y8?c4{;K(^vg80yRL-;k({&c_W*vPQuWHTJ_YtE;Q0CZ(k4kED>_s_6Jb z<<;w!njE}W0p%r3UoBj!r*n^O-qIEC97D?yw2v_0n8BfAvzmUs+eviEsXN=-J_+=x zGs?5{f`WoeirIYE85KhjdlAX{0sjrm4;?eTVPgwiiO#UC{cftchw05&;ZDc(UUB3i z`AoO{0_jA6mq1RW9;g?O78j-S;Pw%X^UIgx0$%);4pZMH2CR7hgO1H4Zmqakzmj|d)oR{w~2JZ`<(fM451=D3VTl&Ip4ZQhD`zLR1JVx*{6Z{0eGC4BsKcyJ(7)pqg_yqoR5S`J;Imyr<> zfSs+aBaXpk|(cv%~Lot{J$`w)eQ5RABFaP+C9i2=zVJ{v+Ow{S&a+WW|z0pKW zWvo6h-&N2^gN-Fe4|-Uxh`@aG=~K(4oGv~+oKy7^d7v1UGJA9CD;Jq*`qxHMi7PJ3 z$Yi?T!(&7qYl_G`#{|EWvQ0o8y literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xxhdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xxhdpi/smartthings_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0726fb9f2b170083b46c96086d28d49046e73a62 GIT binary patch literal 45721 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 F{(lqjMF#)? literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xxxhdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xxxhdpi/smartthings_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3813acecec631a0bf86c43be528d585fa2eba990 GIT binary patch literal 61217 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

w#hoNpK=k80>fQmUhW$u0f=Ea|g_*G7 z#a_7!5&|)3*#SHuW4?#meOLj7?UmkMXb#Tt;I`FXXIW;ejQ22wp3*(?4mQjjdn;4a zJPe5+>hEz?HF8@5{I{hm%nWrHE_s`GWx4gAPVLLyMP*gyDz0?aHc2i?n6{I=$&C>_ zqtWgRE1CBQE8v*R{lHMTt94eVc3`Puc&fcTN^VQ^j6QV#(KhL!IgevWqfH*(ErE-7 zt}I)lL3VIIedA4IhmeOM?Z;wn51ExZKx*d_5^TAo)Y8-yhP}c1yl_5YcRG!)sxiD4 zVPh8sLmXw1Ql%&lEUq{5VIKJRZ%pmW+_S37gSqyM&`jL4(Ss$V>dAvx?8&s7>Uu*F zjMueGwO?An)MeWCz2d)2&fIF7tTRS<$_CRIveC`^5Zy@s@lgM)k}7kJm)=vsd|te8 zeZy9_fps?VURQm`Un=3qD@(3Ns2cv*OrU`U`ej)jcy;nvM>=)CBJ-!wG&#=CHoAx{a#Ie}h7k%x?tUXIxQu3yLHZZY@-$quDol9)QlShS zH0Id%eXlKxG&j^uM`p;5;I5yhTf}-Pzug8x8}A+(>^;T-`GHpbFNWIWPk#d2#mk+( zqTQ~TRyo18OCy)Yin5?^8&cnl#bDL$YaqGn!l-W;oc(D!&V1SUW8j)x{4{HQ{kv5|CZwnUxkzR9_+DTN==mmYUxhCnan86(vbW9q>`pKR_!n_J&Qf8MOcZD+Ga>JA?cV23 zg0jWPFyW`(tvyX@1B-*c4s$#e<6SzIjqe5!FWlf}9$B z_>tfTyj;;Pig(0W^^NjOHle|66}|CVD?P+U+yWnk$-EyvU0q_^HYPu`Z3y(vP(S4l zxd?+xafWVwIO=D0;`m0T0vRvG)Oj0Zz2U(f)UU;|#_Bp5eF1)=Xiz?_E?CDB^}@^N z{cL^~8pZAP z4K8plul`YpWgS;AyAp-){)JQLqr5uD2Q{GTs*@&e)k1$)F17)YpNq_94h(2&RDru1J7=POMuo*bQ%#&v}3tK%x4zg zmy5S1feEy~>giOaRZuMws(=kQbJFXiLM^M-g>1oWF4jIcm<^Cyeg*cyH8_M^25DPYb=^X z7dLCZJtH``GgY`tpXz;9J#tUJs(FJ5sWDKYDTcfn=c=?fP&MxaHqKwgYHapCQWJG) znrpWTlQ#1Sp_SU*DotH5t1!5Yn0TBK4+ozl+4BNLJ#vDw;*c7fnyN;Bt=v01+#i;_ z6pFzGwbSyP<*1LNL`0#$c()4#hpg| zwHdLh1mN61E+U3)e{=DMR;S?M9KPq)WRIJlzM9oBH?oZt2862i5I8!6GX%57LJEu9 z%4&-bShYj?Xs7DstG~W|PipRnLIg@quth!oNR(j3n~$9UyZVi?L#Lw9DOLG;aKBTN zRfd%en>DUIjwKMEEM_EJhM}o^KVTO#Bcg`=s2_j1n`~$#SqB+)DJ5^r!rQC!)0)<6 zkMbk>$(<$ZyHzBizpoD>EjHTaf85$R+Q$~Wn$e;_;=Mi3e}ihj<^7BmGCEMl2q>LT zJFay?t%Ug9ANXjlID3qD3$1DyiZ}hG2yE1=>f)01Sy!55NEqL5&&XqLmpr zUz0}jmeRm~Odi>AsWbGr*hR3fv8%NOd2ni9S(+@$6<;sES@}7gf&hIqrkK2KmJ^eI zWucgg6Je-nDVdoxt_g#|m@n@*{J8gA42US$72`~avVwNI^Ld9mk-}x1t|ZNWIl12$ zTq1=BO?u=jjmf3GQ8rYXU@Ax#zlRw;ddDp#*PZ&u5^+gZtVT3pT(r&RjemW4^a0dj zTqHtp(UcE^$d%@YfH3oGKIgQTdr$h9C3R_GemWl)h3~9#FcQD+S7Y5_Ur~utLm?v2 zt?(qM2!H!yyDI$BCs{R=i@u}U`#wp1+j&CA#9ddMuY)olvpTsH-ZJkR9jeCb5XiSA z`0jZT*el){QP7`}!+v^gHY#5nxAV#}ewE(cu5&(Y(w?20*cvJw_{{Nn)^XiG(}%~) zg>4T7XV!=UT#d#tuWCH-zT1Hsd*@+cDQUu)5rdsfzpD$Cti=tT=y}CAIzRhz<$qj& z`gXSf-3DL#WsYtUO%>x5`tCFJ_M@T(mT1)^O^vvFoX}GZen+cNQUQl(-KQ-$#k=%m z4t}}R*Y9hZVlF74=5p9mQPKyFZHKoU1h1w_MZ;p#aZP}%pCaO@rhYl)SBBT={o{Fl zv&0R)S)O)WkR!A8Z{wJY970u1@(g~j$uD)|%A730OIx|yf0t}pFv0<@^T8F4u!hw!R+bkIZ4zxqT8#((e?Uu zCRlo{(dSbDkpYr*^+U!CrRo~E~D zh1&kf%N%P=>9gA7xIVvbS$Xg=>x#-^M*umPaz3}@IE>2^%Pf|3RGVPjKa&$}WPMe^ zo^w6fNRzJ;C9GXQMS(mg>_sn7bB-3P0} z(U)gaH9D2VWQM5%xFzdH6_nknxr%JwIl_vl=nPj*j&a#iqeL+v=IIxoI=}G{hF1*% zs9$wur^sm*+PO0)16<~NXYJ9#{6Mk(ikqR_?B*Qp=u}19yzx!xrl^w-n~cEJd8dw| z*v?yi0B>+n)p!|`g*IuPmT~>Ie5czz^(C!f_#Uh(Ry;8$!iwRnG> zpGC_A>xdo;+s;g>$MP}O8*IHg2At<(qpewT56t$tff<1bI?-BEeH;x6 zvX>-6T=x~Xz`MfdIie+j-u4LCgHsp4-iujcw#xphJ`=l^q>CHmh;Miol9>m`^cZBQ z>VtG7F%Bd%U0J67*@qlV^bfLfPz0%LsFp{!X#;3;R$x>{|Mg zM6H(;!y7gX*WPtgJ+zjjDvqby-I58{0d7ylq(<~=L=?33SV|>iPu8JTA|Vlrh$1d` zw>ynq_40>Xc?s)|XRWfgxMB&&W&i8d@Dc1iX#>L-45IdEJTEY z-YX7w4NJ@hq6H`63zIOVyDLv-v(3$s2zsMau^A5 zgw*KKhc_dCW>sH3xN0(~?nr2*3%qbEL-9wec}VuPIO^2Y%7m}{G7og+DRXkANq?h< z+jR2_b%wwLv0%X8ySm~0=+E?k7)3v=V}^f9X*NX!Zgi zB}<|;FRRl@(I;H>)9%k7uGKgcO5}~Hrf{T<7L1?8 zb#81-Xae_;Yp-hykHX8+zr94Urz?W4r85R;0*M4>=8laQ+vuySpX;Z)_CkWYBJ!)e zmI2+#{XY`~u~$^6b3^1u-RP6|RgEYs=7r;!>H8_MYA>2i;z>c|NiN`$R^y5~?sdl( zS9`5Pd%p>C<`9I-B%a<@#ipxyZ|Obx{3(2tRiyrM*%)i2P~zMHFp>4+oKHda9A|hs zxHtwtl`YwSY{yY+KukfMMG$jk=&%#AtGn%GizbbhrmLW9*e{;IWfPv|t+eh_z%L%yF;J~})@S`~%gvmH6e~Ck1-tvEwBPrzPDTwfXc;|5GC<(Z zJ-dZkBoYK*-KN&lAk5Fslle9#Du%2K!pWRz^8$)Yw?v8&OVKhCdvS9{Svyg_j7U7X zOI$I!ZCe369u{ll13lbEt|ioimAfUT5_qZ_p`EG4owvTBN@ToIxmphHF_kS|@vFYSD6gDTd|hVv z_XnkR2gPR&56tDFt1uW8&o_I?sIs7UJg*xF$CUE|VrRTV2jBN@63;r{9ROL=;Bou; zq$ZOq1)nF)ml$H~-npR%t@nCi)Rej;rJZ}GDcvO<}SD!Bux?^EO$D&T+Ug|B?y+H6>2)Yof{Pu83C^mZ5)fESe8a$KpgG+ zwD%X#lA|wx#j6x5qL}6)a_5vRaG%F%$v_Ohu|4&^9l*D4aW~_tZ;_x2#+Dkb)Tnea~N^daN0cW}GHDiqG(4`u` zz`_Z2TkW9$MmelXG}kiCj$T2XhHzcuKTt}r{Jixd`oN36B2A*4#(KOaXH_Jkur=cq zjQ)y@STAkdv#MrnTod=d!*oQvdb|QfrejI)laDLUlWB*Sw0eOqN3Fw0L6JBS7PKnw zPNr;1!PN*LcLJvcO~c08u;bW_9SZP|_b$;`KA<^S9+G88wALs7NoXEyv5%2|y)g7{i9&ZJZ0;Ndpzuk9o1T&HnoH=g?-AbLhuV4Z}jd`CY z<*>v@SHNuxXI~>wAC8YF9D*`w>xJs?gI~>1TkAOfraXvBqv-IeguE~HaeXxdg00d#` zNYMR=tqDHiy@Ivc;Dh@(VHyVN(h>cKil$X&no(KdSM&#=Raq2Pv$#-zS%(`48j=_j z^D*IXp2ji})b_*(dR;zB+@ITx@0}_PDh&V)gWC73sJb0?CSSlXepDgsS*EIemqm7* zj)EewFPco4p-tEJQG0KfbFo@;{Mm@rY3@u252iCd2-?@x6S#?y6yFgAj6XY4mc0}* zUO&H#1Vy+WepC3=zp$(9rk7VQbkwxy=B$`#=!;MO?BPD7wb93-MhJ+4UK^B@lxX^+ z{&RxOCSSabCd{W@eEF!6svwkQQ}?qmN*MdN;P^cX{g&o?;b2+}|bFzw4 zH3c8=Vu(xDdJH{;x5hf6!s{IU9!^E>MG{M^!23by|894m2BYsjsMg@gUzbvZk>ms` zU|Bc%Xtv;mCCUIkqldRXi%+Ha*2U|MR8$uWx^~@+8U3niCTC4Usv6anwC|-rnT!eW$eqyYaSjD(lw?itbzNEG?tG z#(ja%n7CL;0;r$FMIT`<8ljMXn9nRMQ?h{4*uk0+mt^}FVyzKF+X}PbQXKK@)Cwm4 zO-6W|-L~gOuJ~!q?++=-4QL@t*-m;8(>-f16!ykG zG;5XYn_}=;zUSyhp?SVv^J^{oiNU8_oLL5MAuegm$Qlmo;k{N?daZsa+=l@WU>cpX z?qoEt8ElgI3JAr0%t`k0IIJTl@;zHYdW}&;O3(nnt4Bc_4H?Fv{~nlHL&6ez+-tEf zx=-DBv~~DwC8aN`PO*=juEW-RvSQlKMn73k|F~IjmJsSBjvueKqWy6bcHHh`Hag@c zZ7izfNqKwS&lC`!G$hb1GI`$pcPDCRwBIR6;G|oaBa>S<{js;iBDr4R`rTu;Z*0`f znI@lvNE1#3s}|vmg0ZS8Y0^88^+nE~zh!TEXL<8$CKM72xR!N9Gn#><9~@Ogw+ zzsr8Aa~HT**?NIv+$Vab0H{f(l8+8$2p@ z5T7dTc8%@J3Ns8!9)irGQh^AvXJjE!p^a&n4BA-GJghmvl$oglDi4cF+#QqAkFwGh zvie?8#aNkwy>VlB4Hf^|EBJ|KhgjNLQ|8i+>lGWcICYGnBS3AjGvcO8cg1AeXpTA0 zt1`nC8awrH%uTpOP)E0sLH7Clqz^BRg3w&(tBB2tzwg`XVTQ-$I+EO4)0R3kFJ@qU zJ<$0gEO5P7H+um?+2=XaiJGff)|bc?TCJ`Qx3$vy<+H$Y{jy5xeX5x<0VPa%I_aUc zSe!ncaE(tit<53R`%%zNN7`l%Vo9WvFU z$vX?NJg;7Q*C1U1WG%EGX+`~;sO`n~{(k{~Jml%mJsu6vX5$YI0I#voghwGVZxmkZw&uTxa6k|udp;RFFD zQMrdoT?GF#jG;Jj0EQnA2SmKhni+hx?t* z5QEDK0p|9IN5-Ly1m#5?64J$3WkxttQb~BEVz78a@z#4-RewxkaVMo7CYct2=S#J@ zY;PPt#BQtwEWS66vxA>e$>tYES}Cv-4`@h}ch%jLLijXFF#wy}!FIlbPcLDR8 z6X-|Q7iY0!96ONeqKi#-M3A4cd!2_Gr{FhH>f(+KJ-yO4%8OHPl9?+`&TaaiMf>Om zkKqlIs=_RQ#$;Udpls1oiON?ucSJRsq9a~3tC7hCbl)gyZfW7fHX+wX*&lBiO3g;V zJO0Gd&hDNTwc-cnY@{Jw%ef_xhJ*_}y-g!14AjNl7mvk&97m?iB00L1=G49=A%)QNj^TY-Yd7#g1Ys&nH3h1s-8b#C8@Izx}u(QJnStM zE|Hx+DkqPRV6gk8NvIwVn}|FqPaktkq%6%dq9a<+1yGN()&;B>nDu*~TEAsnN`^*! zH5zK%Dvy}w;sh6d#_EM0oX&mUP4UM)J3qr!`&Vp=DE>p)X0H0!r6Vh$lJiA9s%N~V zEWSc-Z)I$wp)x}ryUjk`du6Qia~KY$;`WTjpT3PoMK*bkYhbB(k==o` zE1H?;^5lv({d+4g3j~teDVR+$6K>NlUGyIWdvQ2r_{5B56#x8tTih|3Z!zveyZyJ? zD99U&*TQ{AWTySoh}VKWqG|MvOv-;Qv~+EH0tmH4G2(J{XGo#CyYf7=qNEw=D(Z)NUIbl%Q!mVmR!BQy2=DOyx~EnNg~dSQz#kh6^#3GZa046Ly~! zye{}USM9rYzAM11?|3c?RTH7BseDmM_5%TA&!93M?)^f|CK{9w`FC^cN;tp@ zCZuZ(AwG!=y8+d8|21T1IcDHc^FY)>=`Gg{I%r+T?OE;o z+*bgrO!U<4_C0!v)ec-rMbcqHd`8%NlDDh*3Ush;wK`KBS|U^SLj$wxu4j6QiV> zlC|n7iA1E|`jv$LKJ3-SI!Wom&!b!qST)*E|L-3+X9s&oEO4zie6czBD^-QjQQ`3m zA>WpBD_Vl08koyv7R^}0{*lUhhTVwuc-RLe;5xGkqR$SGJPenX)(Su!j+h}Xix!~Q zK>{HU0)OsnoAs%>jQ}hR*Z{WxVnD<`02|qfuIi=S>|UJGA6VC0dk|YP*KT zgrNo(x=d_59egUB(n}k8ct6;MR%0@{ob#`XnpyUN2l5hHIC;O|x?c1EES=qD-u0yB zR^g6|zcMSVz{sy>C?P^PNq)50je{6gIV_7~9?gh=3Xr7JF^_+<7Dpr82F+v#jwgQNcWeo6GS=Bd=1kkf;yt}z;-HzVxrZdp%gs&3fKdyDAJ9@9KD{_E&{NiqZ z`;&E9vU+@Vl+vu>_j=J>yk6&0*n(fsSLlfJqFLBZ_H+O}0EygkyU}qCNU*N_Y{}%Q z)b0AN6HGlN1^H2kA>Dfv^v8<6kO8t#i_Zo~FjS2it19B#JXfeyH1Q0Os`0TxvN~yy zf-lZ$-v8~5-U= zA)Kzkt(zAD<`Mw$%vHink?<7QfmU3qJnxD5$IxvW+v8hzZ+kU;TzYlL*aU2D5FR-=0W-81^@|UXTgJ zQWvG(nv9qcmMb&6^FwkL#ZGZ(+;n8?(8beVB@y-B_uF!og$BAm+Pwu*mEVuNzm5_q zvVWdvN!y>-cRUsHzI7Di<*&-LEwf&<#;CnGofA(Z49rEVdi_P$)X!zv6`iQv^>*-w zeyVI}uo}zi}|Zub&w!HtN&J7T;v) ziDK;+0vH%hE!mO%;>%GSjjg3mlNm`Cusc z5r6r4t0dt*e|T}BgY+_^VC+uOf8hqhLBG*?aT@@gS&cggXLf`Woy&4>1wYENl;tVr zm}1&_KI1(vt#!qqSUY*TeJqI)Q&lAx{VPXTi2Tjoy-72#l8~Ki`7P(APP|%a?~DjxJ%PkuNsnI zBvTC~4}y35FyUgwsxP#7Z!9Uvw`Ca0dZ(}*6ymjyeJ>;~wV^K*8aMtZ7!=UV1v2`&j zexD2(KC;KRdSuNp-QMx9jab(>PjRG!)>ext&t2^_C9li$*mjN(W$R1V^~kcDi!!V8Y5T&Bwys<98&r@zb4v)V zfwoZFdSl`+m&P(|5^*ck>d1=q7^=cocP z``6Ak$&du~GL3JFr(nRcuY*I5d!&n#%H`9n%a#?hy#Lfq$=E;Gq%)ygPF|6k&^OTE-$&}KU<<9^^ zceT!hlqjbCE7CvC-)RkDB*`QZ|K$D0EF2@r6ORR3nb)E@#UFD*2f80l?(Qw&>)9_s zevZHSiOHX<#tvRF9NGPqa9(IR>Gbg;lv}MeQL$JUT-waq$;xWFS*|xmWb%J$i{xHy z-1PSCS~baj)n@mQst)z`~S+t=Agw z?Y-t4QCzK3J|1oz5JEm&9xujAanHet?jW81E_kkP{@tL`8c*5c2kHiEDZVZMRPHUD z!Kmu@@f|Vpm^*vnGLm%la@=*5PZ~F~Gj0ie;K)0&BW(Gq50(+zXsXb39OfdDdV!I6 zJcst$`>Hz83Ftb53^K?GiE()nu3Oonet(W~6eJ{`{O8-hNq}41A7i^`hxr<7l@sXa z3G8X0+Ypd6TZ3&37zHZafsTJW(N$W~)M{gcdR1yZ4N_7s^n&Lvgp zr_DJ%)y&)&;B)10=y(%N8#5lKEDEInZwNzyRO2-^?t4^C;E*&!P;hwAyxJ5g;58$n zrJ=hYYQx1tqAkBENis?aKyLN8ksl;f-(tL8C}FtNe8K()6br!xW4&G+$C`pSymBR05haKAeRO}xu0X02aJ1d&Jpul zvQZHOcISY(Bsu!onSX}Y=emp}Jg56;8D^kRL&%kk3G2`-{#!5^M7er?Mz#AZbA{o* zh_H|FNl!OEYKJAxIY{Q80L^8ui${{bWm`f)Xyq1)Q5A7gu3969iSw}e$=}OMf9B_Cp&35 z`>qx|i$}ZtCq}*A1|W{Co21=HrtRFeG~ktg$I(;#(s7(OlGLY__~uz)O;8H^8moFJ z=7?9)crzzIxURHQIbrsxLYdG&Xi{w;dpsc@3zzs;wZx?`#X%jcCf0( z7puhg>a`ylqyXeoMKxeU%mvXaZP3Qi#N{XmZ%HFU-H=r#l!e&9)ET9;+vp|&N-(|R z3vIf8u@_vk3I8;euyh|P1qrhf95}F059`qhE`YTJaa5K8>Mesy%BJFqLDr?0pdYk& zv$>Q*X4v`XJGoFhmP8oUYYdud5C+mwU<*=09guT@vhfbDMJXuKlYs;C0|#d%xp~=+ zOGz%;@G1@ccy)yOPkO1e9KRp#pq`dGcbC*5`z(q6VW}3w)$FCQ3$dIu%>=sXV@- zdyWsqaJ2qZv8gEm5v%mVGi{+UMa1S#(eCt#6Q9P1cj57hLItpC`8oo)L0|kLo)*A< zUHsfJhR>T?kzfle+!&(-gm6AS))))Syqi-cOTEn9B4C6>F%7z_s8qZi!ays!h}QbQ zTCJh4euY+~zr&me3)AS>@}iT;n=-^Ww^3H!C}L}mfvWfV_=r1mC*CVQqJqK!AR$&I z1;r2=RL_Vv(5#&yuo~|2IBA6l9GSs{Sriy_6xFO~*IM&70qyB`_ zA35+8Q2`IPMx~;0Xm^m&6NSouKLHdBGr- z$vh8-6n7w2u(nfnd^ZSE_{h&~U(0Qo@ghw}p4 zjUPwSeBDNoC3~Kx-c0QlMi% z(ZJar6J*K!G1;?IOz{lpk{IWXnE)P;zrR0{+lOBz&>3j8p&1q&2fKQ=P%KzKA{f#= zW0#)M?f9$H>7xkk=fVZfkF3>z&?v1HHa#X`ijD|b=c1cHj%DZW8hchfRcZpVyE2QO+Tri51 zs98_v^5Q=|+P|Od2fJF2qeo-ON~RQn^b5TH{w;nduq9(WeP>`o1WhLovTkmySKv$l zcBBU9ZHL&xx{UyvjzkT)DA}owllMfiCue)#!Xq7v-hcLJ?EVi*ARyDR~zU`~k5a1QB z%SG&ifsH35hg?7sG9y;IB2It9p=a{~WKeOU_dmnU53a2bVicU}sOnLQQKqPZSRWYC zs{9Ugs;bgIW&lF!m+Z|}5H_mrv$QTMYoX35q!NEp?rzFl#%&x-O=L~L9@_x0x#TN} zQD?$s`ktN{RJo-J^i}%bCG<*Iz|K=p3xi-9OiDg@C&q;Q-$s)?-{fXDOhmG(hxWgw zNB=%DJvC4Y{|Rqxg{6iS(=Op){u_EyWwBXlH>~Q!iflo}Fpd#^K}>3B40(O}fWLL& z78;c#7pdG`-6Uny93}-k?0?d|@6etZYvB9r`CD3JaZMIBJEA6s1G)b9tAIruDj@Le zRfNe9z$-pW0jBD}yS!6Fa&4?Hp|SKf!vIumP`{E41v+BG&A7Qy&nL~ZaerZsTrbas zU=5(WXJ(ozq0S8Z*XOw-Kcwh)hQ=%|Fb;zXk1CY^8-5)=i&vip^UUKEo!d2hoync*$TfS1_Hr1%9OU4F5%3>>X0vU0P9 z^)JK-e9dr3OP=axNOENUbC#eK(g*l#|s=Vnz@Dq_dHG!ec zh(C78CxHliYJhBz8q>E(tN&w&#tH&FTMBC=@ZT$DItsmK&ihw?q|{RceP>;ALjZQ1 zjCx5y2DM|X1wuVhc7zBc0P5tmv5RRwAIIlx+|*4IlBV%irZcwynwQzBqej8>Ci0d> z{YSuqv90=|BMn=Dyy|wpm>h7>l_6WH`7a;;d+60K2@nha&NA|sku44!@@VwnwE=}Ry^TY#+3yZZ)YNpn4Z_B| zpf4Qa?0(9F*lNCsB8<-30s8>qJ}ZqxK#u&Hd;qb{f6t3s&GPRbV<{t*w{y4MGqG-R5q24kdxSm6^C zFHltu|E;{2$iAwHxq&BpOPTw5VYvFYx!wijrM{hlFR9dg#A@febWFYgHO|036W^yR zPV0n`Un}c0Tl9>l`pSOdB|r%CVW?YIa8Ut3EH#J&^D{y}F622WA~!ETs_SQb1Sn2m z1w%uxOGM#tY~uR*0^gbb6m_`)#pt`W9;sifwSJ}m4aUh}1{EVR`XsMe16d+qE~=ED z0YP$Ldi`@my2adZ4IeC1VqsN5dlZHqj7@O&FFVfVW+xA&1~TE9p|%ik0ClvJhyp1| zCX0~kV%12jWs9JQ{~MZFsn85VV4Ty3v8K4#IIER zcI7vqZ9S=sP=9*zTOZ5+oQB^Yr2))C%q_HP%hQBcOx-`n2?KXwDCToc-X?a9TcK8v z1Ag{8vJe-lS_$<0h2s)|uiMkn9_Ga;gRyqaZS&>2^j%+bTlT?6)6UWgfb8~V^}onx zh3nSEpa33;XkYE{Q>hoAg)`_UqY7r-izQ`xkfZ$f^j;!L`Ibk(IAL38h-=@sQtQ`U z7bln>xXycwIZDURKxnb~+%4L)RomCFz%+jVgTvB#9-xZ?Ts287lNi)0e}|=sD@VHx z?=AfAdWy*0`t6Tp+EX(%~}in2!H&rtHpNlYis9%ri)PX3?s#PXB5cM5ewmCsQOC0rH5GTx8&W)cbh$XQ=o z{<-2oCt_TL79-H5P7I}XGQFBvR`WvxfU8L=4#oUdYcZK7xaSq)yVF!3cr-z+$}ZU6EQKa}p4iy< zGV%aGuuCl#Jlld33kHCU1T9BgonW{I?|Z$+`^uc@)m-~f3!j3s`d8^lYa!%XOEfEZe`s`t zk}LP^K8bTtvjK>_Kc=S(cq?2YjP-Q&K!onViO=0?uzd->S;ggpDuLC%}{h%uE0twV=sZzu^^^<*L+mP~^5Rj|_Oi`{N zl~tJE?dRjrocTIU8VJ0%ZNQFJl?O-;<-^K0&PW4Hy`RQ#fTriC5A|tSrlObFv~LW0 zj;QGxDI7BP5kOvr_?SVWLB(VRWrOnm(YPdJ{wn->FaBkf+8wbPyX|RvQO^^TZEQ%C zf)9I1bDGJw+Ul_)OI(A<3-<1TIJDA6r|yWQ(u|Hu^KIWsjX8C;bd7+UQ%dObV>H*E zz)DCJHe2`Vjl;6qO{Y{qD8RvJTkqN0V|mp-~v*_ z6qE$+*-JgYwk5D`cux2dyH_G2{o{{PZ>`YOPC(gbRk{ir=I;5grtI}ok4N?0TAnI; zSA8t{J&839aOcqD9H6N9(B^( z`MSx?F2((EFcKiy*#%O2&TeMOsJK)X^+th+U4O%+&r$&4178M0%PRm-iU0*9?Q^K1 za*OI7)+n)X4;sb5{-ZKoH{DH~U$XRd&{t*kpSWnX*qR8!`L1c(i+>=>8m z3fGjFmwo*Vq9Me?<0fm7JJl0Os~TDVWK=xaFkYDP_9fUa4r$)}frTtonF$N--XC>( zOXerjX6`!xEL3Y@NL`^eqS~Xy=Dp%2>djPnxXvNtezw5JsUOH2k3?EkgCJL$O|nd zD+Zv=FZ}2JA-XVLNoxQjm>S-OxDwsl&14OpW+%zc>e8fTf)faJg5s6#KoPnHY4WNE zYbS<(VgO1u5aZe^z~K#YiS564STeazh#TWIDQq9u!J??OO9-ewsS8tUc5f2PiOx-8 zWGM3$$;k54#qnCdJ5P?E5U|$jeglkSB=|5&1avX?M%|qQNuhm&c*Wat6D3x0Ru2_q zcKes+vsi%Nvzj)+`n8ngU-5t~g%ZvFZkpw4q7faN;^}F^w8&|u5J>_%3-)K5ghE6L zEq*X(x%N+^GH)Py+YBB^0tU4&4q~rxK@ggleNS%grf32$_Jr@q0S_d{j-Zuw7N!u2_Do8X2GocmuM* zjive1c;QT=oXJ6^2@eBSF7_LhfQx%c1Ac>5O4`e%*P>^F;O>*{D1V)hd0hn?$5iaO4NGY_pLtltDn)flZcWm zc}ZrcB-(OwQgtQc=SO`|e4rQw3r&mQ1p1i#?dCwiV*wq%}L=5XI7Rn4Ak zknF?n#nn}fbNn4pnmuql+)b0}v`e_lyQ;k)RNF-u*())lIv8O#1m%QrC_8~>+BYWv z7;L#!Em}YMzE`jlLs#bN+2~wm?q>OZW};z+)8zyo2E=M?Db7v#BU$!7qk6N>d+6&W zZKDN%r6_1gpP}gV?i2H3%$t@#Fur_oK=F>edP~rjz{eqr%G1#Y3m*oNEZLozp_uQM z8gIaV>kmrYyEKSERbQJklR`bx{vSAO4_wEk&{o0I#-eP>m7bn7uQkE}6d5RzK`McioRrv)FmzD5AD5u{1M zrg@LuWJgwu8XX9#$b_uUygmM>wRF4g`|6_mX}6wwhMhMJXj(WCaMHVfGG%B7wx6(Z^!?%K zAp!K0vn!SAJ?Zeb$R)i_wGL^bIU8_?0=?C+vL6Y$GGJr(DE}{$Jh33YPQ+a{>9ppod3BjZAx!d>64%~{Q7 z5?YY4QcS{^g$pd>r|s;=Axk%s;o|#bfksD^>?j|G1;nq#3zp<@yj`%2hhp&dUPhY# zTmoXV6bN-p5&L&bOH*XC{qdW6rzJPe*F3)=@6`sY5PIhlpnk(@Sj0!Yn6}H63gw? z6Khl8q?4Ot~eE%JwzXb|>eu@}T3u^xo2Z7QCSNlZF5U z)LeKOO~}nRNo((2BEQ2JlB^mkeJKNkNM}rmA3H%ZKC82~>pOibm9P`fs2J zLVBP#=~?aR?b)roWzY7q#?3s%h{0sAy~%*OZ&BsBk>tQ{!xt}_{;^=59~!*?o}%N9 zUt-ZjfRkGZ=(Ha5G<+^M8bE3`1bud#8#nuYGHk{Rz%rK}%A6ydjs#?Lhr=rd>f;(A z00d&9(j}nlrWx3y1c-e=dQ(DO!md-PpC&Tq20eIuSa_G(YkVgF;9%(=AK;Ms_l9K& zcGFOhX19JJo-cqvc!0n#!=D)o1j08Kl?|J6hZ6Z;zvDjFl(r6xcA}y4<_Cp(0mU#y z6U&Fzf{B2N4X1NQ+KZJWi>ii5CbR!x0Zv=w{SNa{RQEOcdS^?F#%180i) ziKJj&4DCGz%-Klb)PY!n_-pH5*)nWrcY|0~Z+U;i0uchpCH|Dhh%cSgAyaLy^DVXy zateCwmb%yGWYh9<*g*E#pcKGDW{?TE6|=DY4pD)&7OC@6ag?l>#?X12qJaY@`w z!E$|}5=Ec~2Ju@>hnD@6%s~3k_d_Q=J`UizCvm8_hlGJ-vMnl(^$GXMmTqLVQ9693 z*&83VZZ{T6Osf8JKJhA^atOpQw*nonRo{RgIoti%knAvY=rM=?}*MN|jf>LD1$yg9RhI*FGT2^~Lm^ zBfp;B_)!~isDzHCLZCxahgH!xcBP&Guk`Z%jM;z1ee2~(crcKRO-+dekbxWV9F9g^2zDI=5FC+gIm6@CTJOR!LbxD7@1gJ%O@9Q@70kUTvz+o!0Ej0}TuBS7P< zf-`OTn%DOC$N)UC({^1G2B=kz_r@?Gxg9r?egKsuE{4Ht=u)7jOXV%HaWf27Jm$i` z5Wqzo*aS10eLGKo5Q+laKc`TA_(6=C?r9wZ^aF?_J7O`SdTJ>A%S<0g2 zGKm^Y932JZQA$EWBF)Ogq_#va7(RlsGz~Ae^x+J}$yiW3mliGW=4Q#C^2^=zlK*a9 z2egGtxAq4LQ<{3vkPy88u)N}ZhyNULqlZ(J5}WXMfDGlG_n~$XeWqO2uSwH;QxXpxpcpV8?Q4y*c{{EHKf5LC4DB^m~o_F%0~_+ z2?vGvXF5D*`S1O>E;5dP6ih#23EhQ~^0IxDE=BoVrq9jED=vyT@v+;}n42Ic2tx=U ztNvTq%=U?4Cw44pe)im?W1U`8MMG^71upDes6=>D95yzXER`9Mx8$=~9%qh4g##&y z6Q-|zVn7AiU;x|?FRP%-S9<0(U8E?L+E^ZdOTRvuG(CYtL#t7}qoDQE$mZnGMhExp z*FJ=ZhyAHpIzPr+JoUo=|7X-o(@q9-o6T7rl- zJU8_YZ&Ft-Mo$mlTGM1x2Z49Rekg=Y_>2%4;|e)01>KCK5QX|Bll)+pQXt09Fb)qd z8^}d1HjtA`URaUY#Nz*`XACO3a` z{SI>aYf0&n7zB!aecL%K>!Jc`)#nwMeDmVFS_8!xGDvW%9AJ#mX%1FhcbMa*)O+8z zV&Ld5I?ia{|M_Dx&NFCn3^&|`M(#lFuF^1 ze+^xR;S@X$e_VCMWyxtM{VF9I4PCjNz%|G~JZ0EyxIPv0Lnse8#;=*m;uW}fc;|H6 zMJaqYE^q*FOd#^#;e1yJ8K)r?lzZ%0KN2wr*YY(MFY;yt24T7ip@%L{SO6InQ1JJl z5Lt2GLO$a8&|MO|q)y=mX;w&2BY=!CiZCXTG(^5Ly)Fi$&hx7!GVMAtB)cOEK&dy2u}N;N6h#LEnHBBR}NZv&=8Rcy&0ORvfd^y}X>? zB|3sER|fnNil5vYVbQmF7IT)YEQ|K_e7BJ5OR^Aw0)&eU6$XCP^h`l5npY~P$0+(@ zVe0Wm7*O6IH+my+I68=1DnecVUthb*5p(R(CFFN&h-+Bt>~0A(6@HyDM+I;@0u<^4 zfTTDJJnYYdre^H6`Hg#jlb+K1y{Qi4jg@e-{3&Gzo!ic@fqpI=alj~Xz&+bv8lu1{ z@Lbb19%0hR-PM=i>^N;c@+`#Qwb@l#dGXN?ox^|=>haIjz{Xk+uNy8bLoZE(==%As zS1H|W{}FmR&4^hsY~=CVx~9+`sYOJZQ-J`OLj3oCC@yqMQOosfzZr43AD&S=JO zg*D$9Y4~R0B6+Yg#bv2cg-)@|oZ;(2=r=#F39!gpJwt8pgc_FhaIde^<>y$pZ35(c z6<#LMJG~L6f8w1#2AsS_%1UTw1bX?%p5Ms_R=NgN1)KyN&b0cX5Mhr7dytUAY~ z2!K)+q9fgVG^V1rh{Q+Hq@03ZI{;;ak}(TWMzKU-5ZWKSxzoljDY=)JWj*T1P&l_` zd2Eu+;b=m+CGO*6ytQv2RncZa*10bDV?37QHAoTby)&p)`tGJJ!qR0D*bSfla1Zcz5Kk4yCxzuqC9 z%(*Gl)GZ@GO>q1JIgd75G{9vb^#)H_IBO2COm|LrffTRjxeZ?X+{b4s)|0Er|_ zBPjIZp|~aZuDCKW7U00^M;LOJSirBpG6AVSM6<<|f1MS+>7jM) zd1X1Zwdc#S>(g^=cAVi-oDp(24GdAMmz;>VsJA>Dxo}(WXAd{=C@@6B)`EO6MMBugaoX_SAh1>2hD3wQ-O|mLlt@RK)As4>Cikrz zW!+UAJ(pS1;_J1Fr~7Cik`XoaZCNSyM(&Nt)7TZ?>tU4Xix4#q*$EqlVt%Z>B5KZd#CL zryH1%`}Ubt%yVs?2mf+&l4Z*WUFZ_vvlcnMpwp+;#=x_TtX}?UuwaNlq&@(m zjG&e8X;S^QFmc=4v8jH|nSO_ULQVt5&&Qrg1}hoL-@w#Fl&qQ73X`8{(^NzlDOY64 zJ1L~AG1-EUZ*}E&WVOWuc_LDH9JjV_o`tv>wgqbpB%{bW+3Hgxup!c;pL?M*>%YM7 z7e3Q!F06UjFP>CrpWUsc8OFntOifIjM;UB)97<*fK8jc|A??%EfLVTl$VhFJ#)u!L z`^4tQVFHoM0FXP!#uD9enY8g$-lRK8Awr%_o3B)?mceNq-dS7Hh>Dked-{=~y zA&rda3NSlAo~YvE;c@yGgZ zFn_l$z)t!;i#BVMU&6N*XNJ*b*UcEiK1q86@+JhbjXfzA0o2pb@0l#L>GxYCbCuWG zJQ3*+fHY9gFSxlOsfvYS#n&_&OULip89-;~G}!h7f~KNcyn1d&D)c~vaDsJz`TnQ( zVwtXWHSVkv%T9uQ(}J=98b&E>Fn3`YG78F=1Q3Fuqml|9J|yEpN-1AWpT2dO(HbCp z4?4pGuIF=t7*U@qZpd)}1hK1huMx{jM|G{4cN~4p<@4HI%VBWl5wIh2b$GsoJwI-8 zYMW7S|H9>?hjvDp$!3T#d0_xL-#Mv@Mf8kF!)az=+i0oy*VmLhg@W9Y+taa028Kh# zv2v5WB*9B}#tzsxl6)DoYaamm5#J-<%&x-rC=0%fwol;ZM$=NBy!NQ{IL11&LW2%q zzsZ?qghLJG_`yBk8oQ zY~vCp*MFBvT|5FKVpgnMuyYUC42O{X@Hbj8gbT zIBsBPCONB?cI+8ZO2SA3`c<%SoXB8W;Ja=(AtZ8)Jnl81v2z`c3kgIm$D^yp48lRA zvj_C1%y;tf!e5sn`gbg3{UOmartqmR`rSEIiDei1_Bo3H#4nS+S{K{IrgwIO z1>keMu8TGrjk{03+gCbP9y^Chry461zz&3aT4 z+$~(;VY5r4L!kbhu5!{)V4u}VPLRj3Sk5ze@^VBp`-y#qgM~5ff|e=K-_nTct#bzV z@_+8%iShVS5paU&1$+6i_=xQrAr0owO7c!%o2?35xhm*b|4G-GkkGLX)2}%`wwY^0 z?8_FSN&;T{S^jxkT%1*oigQLOP{C`tyu9Rjl`QPURh~D%OXtb)TszFGa|i^G+Y*R+?-o5FmsNXTR{VeE7Hy+S~jlXhsn$e@Iyw7UOs{EB=m%4J1S1`c_{f!bS- zwRUOeTsx74AzPy11B&|85?_i4unn-aYJ44X5DgATW>vv4`T5zEE=!EQO!<%Vl> z+gmxfoW1wBDzZj%H`Zs@s1mSDrAJ4xxYrJSo)$tTI>&p&L4=TZ480h{|9&!bW?rJf zZ~djY?lpMcpg8|7ZJW6+R(6RZ-cI2xSfTz)bS*OK^B8$}Sr94k0f+4CWUEI^Vo0J6 zzH3swRhx?I^P-vS%%Iu%9oEWCkK&BpCyyDDw<3?*EZXI+rJjcAlH2&V`wy|hy+Nqu zorutsr`ukIzXCi|x}L7-uD9u>Nh7Cg`d^sNVO?u}o&+%;kWL>IVV-l9?TimwyL(^n z@h>ogr2KP>F-8t<2xHiunn82W;nVFNjA?*uqm}&-?Rd{Vedw?{=H$CQL`}o|k1pTW z{VtRfuS(AV<3^BdD{9%{O3QONu(wHc_&U!DXB2va`A|dLXw+21HLP!Pl|pkML9VmC zxp8R>o{!6WN?IS5GdR^$U8#PTU3hESKRh~C3?8(&WXY0PEip(ch{1B57C<|Zpi(Jj zjGnxU)M!mMlZ{VZg(GsV&3?Ot#gPWN6GC_HPvBS?z_WBBdUK01&NtpEX}ET2*e!YY zo`1Ft=@;C{XSnVQJ+@#y&S@bzB94-*CXOX-avf}B!b1+%itH-srq}>Pd#;IT21{pB z*i{8t3rj}PP!yD8jwYDSiR@`wy}z2*C=EC%r9_|aLEFAVXJXL^UxDz)jUG`nzxmPK zIxOC37Pqj(*t{vvTDo&SJDP5Z&F_9W6;PZmM{@JKqbk)7E_rs?Y5okoOUWdVy)$G~ z;m}D8jO045wwNntKh=f-os_Jttr3Uy`Nt}eJJEcFR5;o_ncX>kmhrFp)j0dgYg0hJ z^vre-lT$b2nLC2ryr|$yc-c$8l;5c0^0;(Chj)HKp_}q`nd%^ zA0fuUE2qxYC|9X~?{sO6+Fg`fqe9<-S(-Yb1(D{i#F4ZkBD~qSng8)Rc<6McRM1>x zN*zMSM90}9AFmLNQo|CZCFs)3<0cU~r$non{YUbUhk@hDN!xGBzvVfYC(HpY*J$|G z;(kr=_S&*%=-t66Z4k8k&Li-zmJX!%`TA$Y;OU_;b3}NHeUgT&5e0B{o~#17zs+{l z7I%Z<+c&Fx``NVJZXw)L0Vz}9b;})r;#3TT=pQGU&CP;4n2@s3nO7xZ5k`=QX{0sR zX#!Y~(!>^bUk71lmSq{Np!woQy5As2jr4~NR{;6d`a|uVR9GJ>!pV2`rg`F>S-vyV zj&dpnQVe;#mvF@_ot2;e0pc_RO1wBZhu>6L8BJLEjq&;=I-$>vN!rjAJZIK$Kj+IX zDeojo%=BT@y*rV!cRN0h@0;AWWADUZ>BX?ug1lxF=@7PGd?tnGx#~XkOarLOFK9W} z;gx|vCv&LyvhPlTDFQn_-3V3J*0y`wCo(x#%;u|3pThiQVHuz`e%R1)P0nM zjlQ8D7*?Ok$>Z+k5nXR&k3aNq;LaGif592bk4j&3N*ql3VjiX<$_Vvld_L_KbiJ4I zeE%mIx4Qa%ONdVr*RWiaF<-?1$}wCNlPg&FX*gLe@^b68vmO5|%V;M#tK7k2mtH4; z8qh;TK5*MX^EcwgVuNqokQDkpdCSGzTH*s=$@6)%benXZGSi2larBkf1^s4_9`STv zu|&aln3Cx&6DC9d=Gz*e^Wt@1g=-Vh<7|wIuUTVsS%;OU$ixt(U$I*d3HkV>^J*E=9OGsx;6Vzgr z0>mLI24m`;4{WL**EO!^KhW6{!E+Krq*X$x=f#cXKJ=g^4M*lHyYVcf4SZ8e-tgy2 zVKAaLNXJpOq;s$%qYXdiwL*0fXy|yi+fQfTsTq*Tkj71{8C|QYGFZh zu_H`;oZL^{HWcqpnmG?P50nn<>D9GpjJOmtfMQ~6?8U**!g;00n^LYNQ~ODtFp^QMluu6ywBXyVfcI|ORC|hpE zAohJxM!#{G|I=Rx9m{nhpf|w)1)_ti032;UqlxNQ<5Q#`;Xg0@fPCUS4sFEMgoN%^ zD+K}*>9Jq{``FvTm1-PTP`;?DYg=z95zB9L^iaE^kb^itxe%W8YT4#ucPyS5@OU-k z3jD;_-!zgXpI4Xl9!0+wRE5S&z4lrRwwha;Qs|pYXG^laB-*h?j%eWo9y4BJMB6EE zOX9$F_1(d1=A2HTGy@2oeIf7gXxi%nv6XT)bqMy1nH-h6p;mB*59C-OsKkai!{?~X zvLZi9UqIZOa&wK%EiI3_G!lu&|6VuL=M*}#Zg=dX2eUz%#7Q%VtXDlx?}7(Q<5QKl z>Qg@!Hp?|%>9RzXK4lLzmH<#_2^Cp?u!;&*8!8m<7kNjAu~_heM4ZxOoemr4Dc(iP_={`_>dzsic!?l#LR8p|%fZp}&E zH}ZV5wyio59QJ_QkXWfdHr#x!sHPMc=gykH=Mx;UT&x|#*UNB6KO38vMnBkmP&y!8 zxjV=qnO(M=MyekQJEEm3)GjYRVovZOtTpmPxbNJojutqK4&XdcwyV+dG>_9TC?R~0 zE9!rFZIsG!ZDGRld&l`HtWEZ?h2ivRh-ZYLT7rQ!jXta=z>)b*YnV{V0DF9ep2cqB zStxN{$cpz3d!PJ0MizGehh2{0ndH!E|Aj@jFm~Kht}ac&Y{>>-5jVJNng{PR55_o_ zw{PyFhc?*gBpjv!!N?t>ES>ZhH99|zF3nl$HlzHPs>!8>wT0YdIa}sTmuIBV)yCHS zG?sa4gh?KiHeE|;c@tMDbZ_@a?Acf>gwW^GUSIwK&gQGTuWY4ljg3}aenk3l;ewUQ zSE+|wrDCL%PQ?V2`?aIOI6Ly`I+JAA53yP!+QGLi8lVv|W~CZawvayA zbu&s*%2mO#!XP&X$n!ZF=WnFcYePS1k>VYdJ?Wa*yIn2{N^!Qb8S0u?>CCwv6xaM^ zM>hDp{l`xZ!7rxq?rJSka(c=c$X)|yly-;1(|7j!8LIh8Ly0n3njEFPGi(;sM52DD zj$VarY;Q$3!Q_{o85u2GRo#QL_k*8VfOrj>=Es(POhUoJ=D~-0!!^0vqw2?PBVtG-_mMBe58S>cg}xTs)O0o$ocqmf z*y?Is_xpN@@`Wu#5b7K2o9X@e`Ep%K_Rl{Q`cgn5MD3)#kB=dj}SSI4y<+ma< zk5=Lo7_8x(o_Dz<;&PPM`;WIHo=@^6??VEAWC=J?BM?Kr(0ed^B>r5+V7chf#W-^G zv&DTS(ZH(0hta@_D+}LXW*v=KATc2+_d(w?oX3HgQn8db`+rz~X#)HYVHxXXKy8&g zTtRzU54DsQLsYQNWrTR*>ax&9dmb|JP>3A&ze|9h36 zIe_sIp;{Z)H5sWJs}IuSSBt5FE6bxOZg(@kk62!3@~A55vKtK^odV#U!b56=<#S&bvl4t!);2YkL?F4g6<1sx%bw^(KEUnG;^|zmG*^Tz9iSF0NUg z?*#5)BUi$o6)2)X`~+}@&UG%a7ux4IwsTw-;%GZFC7o9y9MF6rEBT;9J`VnJr{PO> zQO37`KGrHpmlHBeU;f|5tcGDOhhD<`P7yf({ISBE)!u9`VF8Hn z58o9Rw%CXwJpP0tVX$;!F!W{)72!9aHLi!qr1QuO%Ck#+OO@jzx8&}=Bd>{3TKW>( z`2t@1&pv%)tbj!sqOb#eoA7szpx&>z#dN@6c&`{NBc=5j;FC{{;+7tN{fgxYxxvR) z&O{I9ES_(G@tvoGqFwINvjZ7^+*&I)QbNynf00NpnMn+>(scLqU9#ZP$%ZwW;*!Q$ zqPqxgVn|?!p(vw!2f2MK@h^XWU5C$9_3e27cNd_9N>_?<4Ka_Bm68gQqBwd+eCVRl z`P`v5Ppi*+)t@ifo-r%lVp|wI$VFNO?gLO7{XffANX1r~W1x_Q@S9a&TM6IQ=DSBs zZ@+v{2^CmJhqphy+?yI2?q?2NjuYgt<1!(Xf3Fvr(Z^LkVAMzl)sX-i+rON-go+`= zqELEhf^M-4qd19f!zXZ}XhmUJOo)Zm!#_!F@|-~!=i1|DYyO=C1Q?wE-N3j(BDT)W zJa>3?*yZPBBW82bNpcEp<^*_t6AB<((Z6q(WwE?P;agsEYwj)UGK1U5{+EsjJPMDL zwDm3bE;qJoN1c(=r$>v*UJ~z1NYV_?|hC4rS`!EjQBf~c?@#g-ZwLsOHePX6p$HV;-@(uXca>z!cdD^jb>G11h|wG&BMy z)k2E(lxe?B#f55Am;k5!?7>a{9cHv8Iu{{~{&9X%5aCeMS zf&1_81$aO33vTb9ML9L7I#N#oH!~_@0?BLkZe(8rAzAu18ZTe$``VL~rYbI^hxM-7 z%tkLf?WY-RtMi3m$~K}0lT@txdLoL8n?mIZQz58YjsKQ;`iexMWE$G6Zz?3Hhe|B> zAs;Fncaq>F(k&HX^fY;9p+IOmD)<7te=)DO8fL1~E_&Wa-WZAIe&C44E#{(T3N<5= zmzVid+=OzI33sqKSX;22{7V2e9^$%H_h!5cHy z%SvQGw`?lNDNEQskM>{&%EqYJ-J1q$2fn zhOEAzw_#_(snk{t=>ACmK@7H{yx5otPwrr7&)kG^h4WOCvmIW2iX=3s!5miwA3|L? zvE3F|mwz0)kAFa!hyR~DLf6VtmEQ2zK$V%)WHNCvU~b-0t0LgaM8SG*S&j|vobz7G z6?)u5o2CBic)BQ)sHC=^pu6rQfjZ$qs|F&Lh0{kEwUKa>H1u_Tv~y~A zeOege7w#o3E$L-MH8i@|Sk8`z{8ul&R@oLxe%x?UlvkIZ%}_r3cco0LUEc_mOY7XC zfk&h*0_%WP*gJ^fRD^M7IK?dNj$W692qxOTEiraGK~12`EyaaAPHYPN#vgY3W@d%d z?ldk48BTP&_PI;yGA$w~#KZs?t(|?2jT_Fn3nC=qcd>~!An=jNw^=KBfn)tMgV`hR zB<-?~@k&DmA-oJ^>)q4BBKKt31KF<_W$2bfOtQs)ZXTClL++4&v?*>3ZopbcY+Xc+e3%EXP{Y ziLH7_PtY(Q-lw3$ZHQX)-6L05v&J#0LyiCQz;AGk?u<(ukIlUQ${ed5&y~Z0CfUDgjrPJNh_fI$U2~3UvRq%`L>4mbRS2vhR%h z8nDIJvZx9m{WsAy6O2Kv70E3`in-)gn>waKZL&A9UsM?=30!w@;UV zy6r#vl%e&W!jj^Q1FcAu+#kGOWa(_)+Itlc;815ke^Ouh8VvY}M{?);yJYL;TP(?6 ze0z%Bp~uO_VK*x6WWhk(DXMS3_%!M%a}Om~w=h@N9VK$+FW0`i>q%Dzw)A5Ynhvil zL4n(LtLct>X~e(|M~FrwuyLdAT(aLWcItfqP0N2)t^kk9%U}IBy`rFd zvQCdVk#hvGw6@7IV%qEomyBr~2MEabqHrmVuz)7*g}YNEpZj`&#y0I`YzTV`(5}BY zxkl~BeZIurkoXy1f<(^dw8DI2wypzqolAc>=mpCke-V41GYSj7pdNrPNEyrw-lkTNCC_%JXO` zZ2m#-itrR10=8Zujl`V~r$nWqocz8XDvgxgmIFfkQ*TC~NCLiaInaxLIHGLW3YWaE zXvRBmCW;^7f1 zJN-A53p~yrN3~1j(tPa571xhm>}jgg)l>C9k|-Up({r`ia5vwIcDX3KW&-7#p9$BG*@@(bLXATZUJhRY_#cx#hABxLV!QQ28pi74DMu63=fYiEXx?7dxk&-|X-FMOYW z{NsJ@GtN2BIiK@+&f{@C5WMqobl~5x6^-qfE^=6yBcqG4$j4qp%3m^)JJ5NbmAYgoPZb-x@>RqW!Kg55sOD1-=#p`093ygjMqq&sP~HFq&2_^lgL@G|E8 z>8u$3R4vplT4u%it6Jw+Gz#!NmKNrMM>W5ZX|Mp23kV4qYo2HtvYc7d=8nCl9H$Hq z;DqykLy(F>dgqq^rzWJxi(PCSM?2aNi=Mba$r!M54Jw5Nd;u+$m?XuTn^Wzge zADofgAtEwTb9j?gQ$86L0ce(goBM|gX`D=3dT*32RhbcyX|g^qsCffdOC_lM?O<;{ zTAk#~_xfMU%fCeW`}sY$fePB{Vm}LKJa*aJXzk#4d=+?_pE21}CB{~0Z1#M}RzCHu zudnalvYF`KuPPriH*?XmkXUe`p=*KdR6NV(z<06e&CbBLsMi-#KCh`YfD(SCC}M90 zNy77Tk;l(7U6tqijw#fX%Kg7}-kP&;o8+$KHR%d~+#d*AjZ{ei{pPM|tI_*Q`3CC| z9A=2jtZbMw8%fTsU}+NfHTP`0EKo&Szyi9?MgJL=OltZ(y7|V)VPrOZe(Ix!xzpbJac5Etnf6``HjzG}CA` zA7HQ>H^|7lu-2A#DPjJTyyzDd+Q%$SH)vd6PVInT3C8hE&v)(Ji~X0Y8})u?w*~?x zYfny$<4dKACyRiWK}(3u(tI~K(7T?vYX^IoDDJI-YI@D=bulgCf%p#tt}$EDtUVj5oqLI4Eqkfwv|J3Y0`@OLYVaP^BD@2iaoWPfZB5wOjO#C89$Q)% zJk{17)PMTzcmMQexNI0mb{_yc5Qpkj*iWwWjJH&VuQ4U?UDDy83pu~O_VimJPDxdD z>$H8c;O;E?s`cQgMNE1XtnQh9h*c#Qb=r^jfs_g%c5&+IPT%@o{lrvJm%p86Y7pB? zd5Ze8{pSfqNHV2=qGAARH>JN*QEN@(R4=DX^>S%Ow7wQ@-K7FK*!r^!I7s|prIr1_jt^bfTMrW3o=Pz7LPPGhZ5_&t!?bDM(gz;3 zPK9l5fEm{njK0SrDHfJMs{&p=iQT9Oe7Y>wS@PWc$B-f~R#+HQ0Sis4LTG8QIP}>j zI~7ddIqS>jp0k-xAM}A@rDSkVy5dQ*Kvqf?i@K*Y;ssmSOIo^zSB7QUi(`~jn$nl+ z_Dhx+RUMxzHO9%#E4m(tyL*ml4rf+7Hs`o$t`CNDRa$)A0K7XJA{dUhojmL6GzS1d zw_!4E$0*m?OLMYbjRgZsdz}XRA@jAxq3QknOH2v?vU*2t;QOb0+KzU4t@)<>XmS19 zAm7HW;u@Zfmz$xRJKi#PP*^|^`vOR9l>S=+O`|eb;8~Jfk+HO=F`y=xOO%$<$7I6_ zlIa=v|Mz+ND)Kn*fdujjzf~bs23GSr7@oZ$yiAfd;x;cYBe;y(#{D>NKE$$1#N1jV zKpLdv{V3GvcZeAW9Eyd9i=_Z@zIT6;u-Jf@bdpZQM zUqZnJTRG%ku-JJ*CS}NVP0Fa@^)&7A!pLHeBk$56fLvfVc)ZCJmAWji{)LCc`l=}r zoo{i71{-XmsQgfG{d5@;$!^!0Gp|PHg)YB&XwfhrRfjWT6!YQhrfleLyXxIKdDk|* zZ!z`+$K}aCwQ0jT_fg9|r)|i^P+RVd3zzSURKWm$@0@IKwG)6O8!DnYtnuOeV>1p9 z#-|qDpMHDf>h|LuKT`PltE!aEgQbD^-cTx_+QRLB({96<9I%&ke&vcZWvbJIxBc8+ zI>FEBsFtFiYW3LNm;7>Xf%)6F3kp_NiK`7oP0`GPB^G&Hsw(sapN9M<0erx4L&bR+} zSTeY;^ZzDpPpMb;_^ooVjhuj+96kD($~~D^UX3wMzmE-De&-)8Wq^W}AH@hQ1z#pqJs{*$qpi;0-^NeIm&gziQk~E+Nf5EUZ$tG{TU7Y_WQ~3P*({X8&uIZ zh1kKl$WGBmQJp8fj>#$OW=UU>%?&rSuHIEEn2EWM4lfnSc*NNtgesOfd8MJDA>Hyp zkt~Pw-y1=MskzUZ(1ZXYDmQ-K_^tBL1yzd7`z%!mW|-aj8V>h|&E@W3I3wK_zN}8y zrq|wnwe}D7G3&80cc(qajo>pUr1)q~`G1m1`ZN++IKwBLkk?my*Fgr&B~*l%c*p}^ zHRQU_j2E71t~ogt*!h4h}D&d!Yw4Zlx7LwwD5@~v|9Wr&Vo@9!1Xsk8xc{ll+% z?-^Vkrv3h;iI{+IoHXddp*H#*(vb3YHenE?2OhAd5D*ZUvvu(=1(me_-@ey~q^8u| zTK6@*1A_%L=~25!k70@Z?dx$Zt*x!DQ!V8d6ZRqyB-lz+lYv^ha@q2MSqrJ;fj~kV zFR~@MOuO0ANAfwxxOfNyKQEsg^QeXQoe5QPUIqXm#6ZRNblbHQA_!~JnXZ|y@oJhi z8Z&sFE<|5GnbP?{LZMDI6D7l_2JU(eO)8@(pB(zd3uRZWH9e&9)FB~)%yG`2QmsFwWyR_~dYgHYkO}ST)=y1NHlAD>tubaL zfm(KfLOF;aVV}chbPfM~3N4cC-Cg9QisFH#&0;aXOiOCjoXhz86g{N9RlM#QwBS(9 zclI|eg&5}>=P;oDs{P`ShlPM(hV7p_Q_sI0^fDwohgA5IDxLVIKk^2Os-Rj8pLe@o zX6%L($GBe_{~0N7XJso9 z>KzgjSa_RcsT=mk1x?jWS8$V9}F|)CArJgV%;Ssm_f`F#j56o0w zz#W%=ZACsf;qb2DMJeeIK;;J+C>u_TG%xZE-j=#D2Tb zPVwo}wnsHy4yqEe2VDe<%`!Cv6w0045illE4vy4lldOHtAd}_uAiq)o-m@M^5LQmQ6qnILj+S+-}V+69HgP-Aq`Vfk!(UrZc}g81YOyG zZfU)Wz$3Y!pyuN1EJ5W6Fnv8o>moT&Y`GC2s zKVHu>*w@;smmf^Vjt&BlTBUH^7B4I9bM*w~=Bt&BimdGoW0p~T985@!qT%%NSjOB5aGuo)w( z18oxj*i}xqlPZ+%Piq_XLKIe-@Jc>%ba^5P5B(SphZM4W0Ms0U!`aWh$+jq2`~A>M zw|xv{54ro!%+0wL<4`k~0b6cUIcav%!B>#DF2{2HZ%*_H>BMFn&Y(_7o#OIs%g2P}{cs8# zll9@+xbCF{-Bdfu;RDnWT!n+2z7qTYFL>?x0PvTih zY28*81j#vr1=VUJEU49fC{pogxZ*_1dhXK70a4tr>UFcdy<^ScVPRa2bBz#G*YyuO z*iRfyzayV~nU3Ocxa=CS#>@uUJqj^7Jr6(FUi7mR>Wf;bBZAI}*v+(WBvioPyamro zA2i4GzoR6jO3u#6&@TNGALKf_{S8QW-4=*Y^;g%|?`mm_t&!Kv5m5>29;ZIoAPA!2 zZT>5F$uuEqJB8#~8g6?vg5&l`$o<9PVw(T{5>7C&{)g@ixH@tDZA=)#71nAo*bb&` zvoKJSU!(`#P6#E>m_k|vcAQcVR|d5<4jZpi;n7MSA|9bDzC_|4WZspZw6|N$I&%Qr zEQ%aSM3?|R>p{2x_<6=#=X8FB8+`TkX~xYBl}l+GgFDXfeEwtZ6+qzrbY#R9$SK!Y zb4f-bQsOEP6%BF^{ic4ZI}Gt$l$7dpSN>0egOfu|?B3TBuB`V~`PF|1=)(%iCR>YC zStCjI-va~L-MYD1h{e4gVliC4aUum)3KqS zMW&w^Dt?$>*rIgI`mQjv$kZP=m)DEi97tO9BTr+zT70xWOiIU}cvOR^fa%hvVbpyM^PJAV+af9B@>Ggh8N9BGpXsgX=-!5Rh^He)~1-LTlP}3@6bw z%{xO1+J$o;fp5e*NlgMdtl;aFKw2MYR_K3q<-s!vC7rDEUSHmb+QAU>#e0YH^bMRp z^sU$5+%n%?yY%Gxn+jw{xWxLQivwaF_9UF=n=%Dh;=Vz<#R7eZx!Q@NUAZ6mnj*7yIzn;{hL|Y^=gM9wkmmJIFhq0_keYP@ z&`NMh!1DsO$V5{0@^I8q-W&wsu(A;y1{p(J6+=RNo1v05qJB4SpTb&E{zVh zU+;)Vg`1ymM~9JSQXh^QO1wxE!S1EIc`xzNJ(s2h#en1DI5MCTe;4WD!-t{?w{jnI zj87hY0R?lAsOV*?kt+G$N3Rq;(KO6>}0BSNOQTagy zE;RYk!cFE&_dRw%OdvM%!|9kf3}oT}%H~YRCA43cR5YCeN1@x9$o?Zg>ZdYUIJ5*J z2xmwsAYi$EPD*-_7d=S<-6|d2Z&5DYrl24gB-!ioaXzbxc1PAvJP!=oLn#2=no`SG zPY7@M%zAQ~+mNT+)u-(x2)?x)@Pe9>IJ_|S5>m7OidYk7Tp;dlNPMPp(f59uPnd|C zT0U(d;D4afu-Ij4t!_GKiwB63y{)YaT&9Rg(-{4jqoY#y-&%n`Op&KDAH3FOpau2R z(`kgS818Ma(Yuaa?L_?qH=Cw&&4`1=fR3^~igBEZb^fz7%rN)*gq&)AyH|q;(e!= znx^QqdUc+FS=&rDm1GkZO*x;!U2tlsJ|XCC;a38)rv0s5(dWzPXIF~O9S+{Tmr_TL zzmm5eW5R|074#tZxcFC=Q|T}6Y;(&e^NJq+ALM?KN~eypl9v;(SFBbom}-fcG=H2< zUsYF9mgFLo2K(0pua>>nB~gV8Dul|zC8(CDHIDRUh?YbJYXE2`7}ad^^(`0W3H0Mo`trxFe4qIWa-gPXD?dD)GCkoa z%|zLSb=&{LwotTivAH@q4~C5XOoVQy6g{Loff7CmBYiMZLNxNN0l&mN}ho7Gx z==$|*sUCpS=>em=FKSJw+7(_LSsq9a$b8NFv)MigA_{hPYa`&G^e1zjgTT4FvADSC z&-RGXP1yIh_()O?9|lX6&InHNy$~Pv^&vn-z987WPLsa2x%RYC!cuV{n>=p1=P)EEy6N zUO%NzfVCMG&}m+qoV(^(4dzs!=&e>?U;iA~w&J)BY3}KI&}C*Dc`AWbZe+7k-$e8E z=IklVnJoSzyTQbNDwByB-ZG+)E9w7G*(8eJX#QnCDhb$USX{GUw8{1Rf|^RKG^8cn z08Bw@YcKo>40N^Fo01KhfA9tCN0&zoCn7$~dV?cMlSCz$uaY+g%$8G0?WJkwU7@0^ zEUSq0E`-)ybYWrPwrh2DwZL0-%AiY#)1H$3uCA`4d#HVnN^gnx%_()t6M@@ka9s5otw~mzN>=;?f85rrG)Ok*7Fq)Y(aOxwaNJW`S~{0R zV_Df&T-su4zQ0KOmo^&}B1^cElQ|{zXm{O<0K@o)O1PRlW;h#1haTO?&BJA?xaGpX zcQMnus#{qtv4Z$4)2RO{pdV9sSE7uB4EO)+xy|D7EBU#(a~6OjAN95FBT;x#raTix z#D8te1tL0w@B}r5ECCl}68dKUN+!Hus=;1>-j_r}rh;2dPOff8m=uu^)bdPR$nRAP4}b#pMw9>?-&~~*CI{o^$?*RDq8hOR%#`UV0-&D8nfE%6e*5vU-qOh(ku{P9W+Hp zAUg{TUc+Z{yCmq-8ne=xdT$6fDayB4b(4Rcijb1R+&K7OU=A)5bFn)<@u2smGWY$1 z0}C9B>9>5>8-I-LsxA$4@X^r=-RCFf68{KX)=D1S&D$otGM3L_74pf@&XI2l4avin a_aUijzvn5jd#;3^k&}LOFI`gS_5T31$KwM4 literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-night/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-night/smartthings_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6fd3d2dbff922745e172b9a4c9d796eb0ec061a3 GIT binary patch literal 9513 zcmV+^CDz)BP) z33yahw(tL^s*+UZ3PZ?562>3`i31{v0(Lh9ftGHEhstZBt^MqGy@E~OR&WZudu?9} z{qWhgw*7S*uCyX;OSqzl*cw1=1cZb^h!8SB!jz#ZNoA^G-*2DVCtVb&Gt``9|NQDB zlEXQ>&e`Xzv)2BvwFE*4LX98@G4u}rQ2=x+R;(Ddc=7#{dU|?vcDr4dmzOt9%aFRd zI@@Y%>%NVNiE*^GwV8kLgYO>$(9M3`1HefLv4#ALayT3gN0y))AwdwRp^09#YE|m| z`3nj%GczW|$0uaP$H!09>-E`!AY=#Y*iNVOsKeoCZEI`$%3`t9S65dbDJ-0Om>H&S zLWm<+$L4T29F8(UF+zeM7y%e7Dvm75$jF$Un3ygxVwWo6~_ zf*|~j5YiUeqvmipoc@bXo{%62@f8(E?#;`~ThpICA0?<~v}ezr=L!qwe#zI2I2;Zq z@M!XcsQ0sK)vBD<*0$G-M&rDJem$sXbjKZceBRJ-eytz~Yq(d$;cz&CMW=ReRBHX< zhuda9|NINP27>`|XV|b|zqDFAwm>j+~KkI2=y@MpZbD8lY3BPX9b7Cua?S z1j6 zS6A2eq@=`q2_e@0`3*Q64k!G0^@IdLh@&dFa2ufdjxOwMXvT@w4z$@F7#?H5bwd*I z{j?!Si1Inj$#1AQqo$_j7lI(X$ZODXI2?{|^!XI0VYrHlBlm?<1!w88q52X}poDr+}2h|mdij8_^W`ghd!{2)CAuilV{C|!7T0#>Va zQ%Z{IAwo!3SO&o1a5(*#t2`lE3yzlJ36}xtb~y3qo=ViVbwe*29D?ylahQ{tf|O`I z&RVbe&D4skfELR~uK7R4uyj9tJ2%2V3H{z z977h%`^3k`%^`$zgk=C64u{iExgv%|y&zf*J6r~c8pM*yi*ORaL4cp-W#EzVSFiab z7z}vj#&IYx#eoo=xb24O^Whk>2rcjP;fLF%hiw2H4u{iE@mxrWqwN^N^;J%_cH)Ay z2XqN2N)YhaH5p#FHRyEsm%J?KK>(t|o=cXHj@6SHGiE%(+Lm)T91ce%R~RAMkS?5( z?6Ym%pwU5UgeD}%A~{-Kf_=k~1gcjM*M=^2+Qs#xa6y~+tzNw*Eo=kea5$WPNUss1 zExBn&)Np?V9d&G&AyPtsAcpS5?cq|;g$o+OeBglx?&9TqIGlco3BWA&$>oS%uek#qKXt&vAw?EX}CWhju5lS}b5u?|KY^;5emX=11cyw3?!QpVU zQVgI5z!&UO4WNt}CQgv)H9{2?M;3*74fxA<7vL!)@3K4aZ~LooxUn62;xb70WDgJ9xZR<~JR%0d;ap8Fd&8f_ z&rL7OWqwBuQ9+2uGw6_3{-YBU6C*-mym)*nwpTY{|HU>qodTZwx)z(O8Zl>N3WgY? zP}AOp(%ME`>a;QGHo>i_iMS&@B?3lIOZj9>7X;xi5!4QR5xbEJJi-fR0Ojmc#{Qo( za47IBx#@1rg

7RLWW4{qi5L+ZIa&aN!7zgvp>R>e7Fm~R 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 Hu0mjfbflOJ literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-xhdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-xhdpi/smartthings_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1a71048e5da0d0d59a32a208a53b6f467141420a GIT binary patch literal 30892 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 literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-xxhdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-xxhdpi/smartthings_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..449c38788e140535b3236257fda946c78cc23e85 GIT binary patch literal 46956 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 sT|^uE!)2cS@pPJn;Ob%7 literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-xxxhdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-xxxhdpi/smartthings_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef21f51f5e2f7a55a40fa215d9cadb0a89fe1e1 GIT binary patch literal 63074 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 + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable/round_device_unknown_24.xml b/examples/st-device-app/android/App/core/common/src/main/res/drawable/round_device_unknown_24.xml new file mode 100644 index 00000000000000..22d47670e5fc8d --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/res/drawable/round_device_unknown_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable/round_toggle_on_24.xml b/examples/st-device-app/android/App/core/common/src/main/res/drawable/round_toggle_on_24.xml new file mode 100644 index 00000000000000..d42714cc7696e0 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/res/drawable/round_toggle_on_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable/smartthings_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f950c2ece77742150f4f330494adf45a0006ede1 GIT binary patch literal 9814 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 literal 0 HcmV?d00001 diff --git a/examples/st-device-app/android/App/core/common/src/main/res/values-night/colors.xml b/examples/st-device-app/android/App/core/common/src/main/res/values-night/colors.xml new file mode 100644 index 00000000000000..cbc187543ea0e6 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/res/values-night/colors.xml @@ -0,0 +1,5 @@ + + + #171717 + @android:color/white + \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/res/values/colors.xml b/examples/st-device-app/android/App/core/common/src/main/res/values/colors.xml new file mode 100644 index 00000000000000..14778835968022 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/res/values/colors.xml @@ -0,0 +1,12 @@ + + + @android:color/white + @android:color/white + #4ca7ed + @android:color/black + #f6f6f6 + @color/color_background_secondary + @color/textColor + #fcfcfc + @android:color/black + \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/res/values/dimens.xml b/examples/st-device-app/android/App/core/common/src/main/res/values/dimens.xml new file mode 100644 index 00000000000000..755c53609e9b3f --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/res/values/dimens.xml @@ -0,0 +1,25 @@ + + + 350dp + 25sp + 17sp + + 10dp + 48dp + 48dp + 7dp + 7dp + 13dp + 14dp + 24dp + 17sp + 16dp + 16dp + 16dp + + 11sp + 20sp + 15sp + + 50dp + \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/res/values/strings.xml b/examples/st-device-app/android/App/core/common/src/main/res/values/strings.xml new file mode 100644 index 00000000000000..461c15d30ffafd --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/res/values/strings.xml @@ -0,0 +1,6 @@ + + + Samsung OnOff Switch + Matter Device + icon + \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/res/values/themes.xml b/examples/st-device-app/android/App/core/common/src/main/res/values/themes.xml new file mode 100644 index 00000000000000..fcbe6bc78d57d4 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/main/res/values/themes.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/test/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleUnitTest.kt b/examples/st-device-app/android/App/core/common/src/test/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleUnitTest.kt new file mode 100644 index 00000000000000..20b54aa0c63c72 --- /dev/null +++ b/examples/st-device-app/android/App/core/common/src/test/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.samsung.matter.chipstdeviceapp.core.common + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/data/.gitignore b/examples/st-device-app/android/App/core/data/.gitignore new file mode 100644 index 00000000000000..42afabfd2abebf --- /dev/null +++ b/examples/st-device-app/android/App/core/data/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/data/build.gradle.kts b/examples/st-device-app/android/App/core/data/build.gradle.kts new file mode 100644 index 00000000000000..e269b0278c56ad --- /dev/null +++ b/examples/st-device-app/android/App/core/data/build.gradle.kts @@ -0,0 +1,55 @@ +import com.samsung.buildsrc.Deps +import com.samsung.buildsrc.Versions + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") + id("com.google.dagger.hilt.android") + kotlin("kapt") +} + +android { + namespace = "com.samsung.matter.chipstdeviceapp.core.data" + compileSdk = Versions.compileSdkVersion + + defaultConfig { + minSdk = Versions.minSdkVersion + targetSdk = Versions.targetSdkVersion + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } +} + +dependencies { + + implementation(project(":core:common")) + implementation(project(":core:matter")) + implementation(project(":core:model")) + + implementation(Deps.Dagger.hiltAndroid) + kapt(Deps.Dagger.hiltAndroidCompiler) + + implementation(Deps.timber) + + testImplementation(Deps.Test.junit) + androidTestImplementation(Deps.Test.junitExt) + androidTestImplementation(Deps.Test.espresso) +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/data/consumer-rules.pro b/examples/st-device-app/android/App/core/data/consumer-rules.pro new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/examples/st-device-app/android/App/core/data/proguard-rules.pro b/examples/st-device-app/android/App/core/data/proguard-rules.pro new file mode 100644 index 00000000000000..481bb434814107 --- /dev/null +++ b/examples/st-device-app/android/App/core/data/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/data/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/core/data/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..9b9203c728a691 --- /dev/null +++ b/examples/st-device-app/android/App/core/data/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.samsung.matter.chipstdeviceapp.core.data + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.core.data.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/data/src/main/AndroidManifest.xml b/examples/st-device-app/android/App/core/data/src/main/AndroidManifest.xml new file mode 100644 index 00000000000000..a5918e68abcdde --- /dev/null +++ b/examples/st-device-app/android/App/core/data/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/di/DataModule.kt b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/di/DataModule.kt new file mode 100644 index 00000000000000..6c582b829b3b4e --- /dev/null +++ b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/di/DataModule.kt @@ -0,0 +1,22 @@ +package com.samsung.matter.chipstdeviceapp.core.data.di + +import com.samsung.matter.chipstdeviceapp.core.data.repository.* +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent + +@InstallIn(SingletonComponent::class) +@Module +internal abstract class DataModule { + + @Binds + abstract fun bindMatterRepository( + repository: MatterRepositoryImpl + ): MatterRepository + + @Binds + abstract fun bindNetworkRepository( + repository: NetworkRepositoryImpl + ): NetworkRepository +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepository.kt b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepository.kt new file mode 100644 index 00000000000000..bd85f638f7e934 --- /dev/null +++ b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepository.kt @@ -0,0 +1,8 @@ +package com.samsung.matter.chipstdeviceapp.core.data.repository + +import com.samsung.matter.chipstdeviceapp.core.model.Payload + +interface MatterRepository { + fun getQrcodeString(payload: Payload): String + fun getManualPairingCodeString(payload: Payload): String +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepositoryImpl.kt b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepositoryImpl.kt new file mode 100644 index 00000000000000..63afa343a743fe --- /dev/null +++ b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepositoryImpl.kt @@ -0,0 +1,18 @@ +package com.samsung.matter.chipstdeviceapp.core.data.repository + +import com.samsung.matter.chipstdeviceapp.core.matter.MatterApi +import com.samsung.matter.chipstdeviceapp.core.model.Payload +import javax.inject.Inject + +internal class MatterRepositoryImpl @Inject constructor( + private val matterApi: MatterApi +) : MatterRepository { + + override fun getQrcodeString(payload: Payload): String { + return matterApi.getQrcodeString(payload) + } + + override fun getManualPairingCodeString(payload: Payload): String { + return matterApi.getManualPairingCodeString(payload) + } +} diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepository.kt b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepository.kt new file mode 100644 index 00000000000000..a8a5a18d0e8b8b --- /dev/null +++ b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepository.kt @@ -0,0 +1,5 @@ +package com.samsung.matter.chipstdeviceapp.core.data.repository + +interface NetworkRepository { + suspend fun getSSID(): String +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepositoryImpl.kt b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepositoryImpl.kt new file mode 100644 index 00000000000000..dd98e9c2252571 --- /dev/null +++ b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepositoryImpl.kt @@ -0,0 +1,33 @@ +package com.samsung.matter.chipstdeviceapp.core.data.repository + +import android.content.Context +import android.net.wifi.SupplicantState +import android.net.wifi.WifiManager +import dagger.hilt.android.qualifiers.ApplicationContext +import timber.log.Timber +import javax.inject.Inject + +internal class NetworkRepositoryImpl @Inject constructor( + @ApplicationContext private val context: Context +) : NetworkRepository { + + override suspend fun getSSID(): String { + Timber.d("Hit") + return try { + val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager? + wifiManager?.let { + val wifiInfo = wifiManager.connectionInfo + var ssid = "" + if (wifiInfo.supplicantState == SupplicantState.COMPLETED) { + Timber.d("ssid:${wifiInfo.ssid}") + ssid = wifiInfo.ssid.replace("\"", "") + } + + ssid + } ?: "Unknown" + } catch (e: Exception) { + Timber.e(e, "Exception") + "Unknown" + } + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/data/src/test/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleUnitTest.kt b/examples/st-device-app/android/App/core/data/src/test/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleUnitTest.kt new file mode 100644 index 00000000000000..6804e8d4d8cdc9 --- /dev/null +++ b/examples/st-device-app/android/App/core/data/src/test/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.samsung.matter.chipstdeviceapp.core.data + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/domain/.gitignore b/examples/st-device-app/android/App/core/domain/.gitignore new file mode 100644 index 00000000000000..42afabfd2abebf --- /dev/null +++ b/examples/st-device-app/android/App/core/domain/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/domain/build.gradle.kts b/examples/st-device-app/android/App/core/domain/build.gradle.kts new file mode 100644 index 00000000000000..35327c0df691d4 --- /dev/null +++ b/examples/st-device-app/android/App/core/domain/build.gradle.kts @@ -0,0 +1,52 @@ +import com.samsung.buildsrc.Deps +import com.samsung.buildsrc.Versions + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") +} + +android { + namespace = "com.samsung.matter.chipstdeviceapp.core.domain" + compileSdk = Versions.compileSdkVersion + + defaultConfig { + minSdk = Versions.minSdkVersion + targetSdk = Versions.targetSdkVersion + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } +} + +dependencies { + + implementation(project(":core:common")) + implementation(project(":core:data")) + implementation(project(":core:model")) + + implementation(Deps.Kotlin.coroutinesCore) + + implementation(Deps.inject) + + testImplementation(Deps.Test.junit) + androidTestImplementation(Deps.Test.junitExt) + androidTestImplementation(Deps.Test.espresso) +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/domain/consumer-rules.pro b/examples/st-device-app/android/App/core/domain/consumer-rules.pro new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/examples/st-device-app/android/App/core/domain/proguard-rules.pro b/examples/st-device-app/android/App/core/domain/proguard-rules.pro new file mode 100644 index 00000000000000..481bb434814107 --- /dev/null +++ b/examples/st-device-app/android/App/core/domain/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/domain/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/core/domain/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..1ddd78a49f5957 --- /dev/null +++ b/examples/st-device-app/android/App/core/domain/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.samsung.matter.chipstdeviceapp.core.domain + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.core.domain.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/domain/src/main/AndroidManifest.xml b/examples/st-device-app/android/App/core/domain/src/main/AndroidManifest.xml new file mode 100644 index 00000000000000..a5918e68abcdde --- /dev/null +++ b/examples/st-device-app/android/App/core/domain/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/CoroutineUseCase.kt b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/CoroutineUseCase.kt new file mode 100644 index 00000000000000..bb8dab46a416da --- /dev/null +++ b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/CoroutineUseCase.kt @@ -0,0 +1,23 @@ +package com.samsung.matter.chipstdeviceapp.core.domain + +import com.samsung.matter.chipstdeviceapp.core.common.Result +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.withContext + +abstract class CoroutineUseCase(private val coroutineDispatcher: CoroutineDispatcher) { + + suspend operator fun invoke(parameters: P): Result { + return try { + withContext(coroutineDispatcher) { + execute(parameters).let { + Result.Success(it) + } + } + } catch (e: Exception) { + Result.Error(e) + } + } + + @Throws(RuntimeException::class) + protected abstract suspend fun execute(param: P): R +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/NonParamCoroutineUseCase.kt b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/NonParamCoroutineUseCase.kt new file mode 100644 index 00000000000000..d196f3220d8364 --- /dev/null +++ b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/NonParamCoroutineUseCase.kt @@ -0,0 +1,23 @@ +package com.samsung.matter.chipstdeviceapp.core.domain + +import com.samsung.matter.chipstdeviceapp.core.common.Result +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.withContext + +abstract class NonParamCoroutineUseCase(private val coroutineDispatcher: CoroutineDispatcher) { + + suspend operator fun invoke(): Result { + return try { + withContext(coroutineDispatcher) { + execute().let { + Result.Success(it) + } + } + } catch (e: Exception) { + Result.Error(e) + } + } + + @Throws(RuntimeException::class) + protected abstract suspend fun execute(): R +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt new file mode 100644 index 00000000000000..d4948748f5c262 --- /dev/null +++ b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt @@ -0,0 +1,18 @@ +package com.samsung.matter.chipstdeviceapp.core.domain.usecase.matter + +import com.samsung.matter.chipstdeviceapp.core.common.di.IoDispatcher +import com.samsung.matter.chipstdeviceapp.core.data.repository.MatterRepository +import com.samsung.matter.chipstdeviceapp.core.domain.CoroutineUseCase +import com.samsung.matter.chipstdeviceapp.core.model.Payload +import kotlinx.coroutines.CoroutineDispatcher +import javax.inject.Inject + +class GetManualPairingCodeStringUseCase @Inject constructor( + private val matterRepository: MatterRepository, + @IoDispatcher dispatcher: CoroutineDispatcher +) : CoroutineUseCase(dispatcher) { + + override suspend fun execute(param: Payload): String { + return matterRepository.getManualPairingCodeString(param) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetQrCodeStringUseCase.kt b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetQrCodeStringUseCase.kt new file mode 100644 index 00000000000000..57346ac0fbaa6f --- /dev/null +++ b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetQrCodeStringUseCase.kt @@ -0,0 +1,18 @@ +package com.samsung.matter.chipstdeviceapp.core.domain.usecase.matter + +import com.samsung.matter.chipstdeviceapp.core.common.di.IoDispatcher +import com.samsung.matter.chipstdeviceapp.core.data.repository.MatterRepository +import com.samsung.matter.chipstdeviceapp.core.domain.CoroutineUseCase +import com.samsung.matter.chipstdeviceapp.core.model.Payload +import kotlinx.coroutines.CoroutineDispatcher +import javax.inject.Inject + +class GetQrcodeStringUseCase @Inject constructor( + private val matterRepository: MatterRepository, + @IoDispatcher dispatcher: CoroutineDispatcher +) : CoroutineUseCase(dispatcher) { + + override suspend fun execute(param: Payload): String { + return matterRepository.getQrcodeString(param) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/network/GetSSIDUseCase.kt b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/network/GetSSIDUseCase.kt new file mode 100644 index 00000000000000..b6955286c9b85e --- /dev/null +++ b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/network/GetSSIDUseCase.kt @@ -0,0 +1,17 @@ +package com.samsung.matter.chipstdeviceapp.core.domain.usecase.network + +import com.samsung.matter.chipstdeviceapp.core.common.di.IoDispatcher +import com.samsung.matter.chipstdeviceapp.core.data.repository.NetworkRepository +import com.samsung.matter.chipstdeviceapp.core.domain.NonParamCoroutineUseCase +import kotlinx.coroutines.CoroutineDispatcher +import javax.inject.Inject + +class GetSSIDUseCase @Inject constructor( + private val networkRepository: NetworkRepository, + @IoDispatcher dispatcher: CoroutineDispatcher +) : NonParamCoroutineUseCase(dispatcher) { + + override suspend fun execute(): String { + return networkRepository.getSSID() + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/domain/src/test/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleUnitTest.kt b/examples/st-device-app/android/App/core/domain/src/test/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleUnitTest.kt new file mode 100644 index 00000000000000..d96fee37920d7a --- /dev/null +++ b/examples/st-device-app/android/App/core/domain/src/test/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.samsung.matter.chipstdeviceapp.core.domain + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/matter/.gitignore b/examples/st-device-app/android/App/core/matter/.gitignore new file mode 100644 index 00000000000000..42afabfd2abebf --- /dev/null +++ b/examples/st-device-app/android/App/core/matter/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/matter/build.gradle.kts b/examples/st-device-app/android/App/core/matter/build.gradle.kts new file mode 100644 index 00000000000000..82b01f4f10bcc0 --- /dev/null +++ b/examples/st-device-app/android/App/core/matter/build.gradle.kts @@ -0,0 +1,60 @@ +import com.samsung.buildsrc.Deps +import com.samsung.buildsrc.Versions + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") + id("com.google.dagger.hilt.android") + kotlin("kapt") +} + +android { + namespace = "com.samsung.matter.chipstdeviceapp.core.matter" + compileSdk = Versions.compileSdkVersion + + defaultConfig { + minSdk = Versions.minSdkVersion + targetSdk = Versions.targetSdkVersion + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + sourceSets { + getByName("main") { + jniLibs.setSrcDirs(listOf("../../app/libs/jniLibs")) + } + } +} + +dependencies { + implementation(fileTree(mapOf("dir" to "../../app/libs", "include" to listOf("*.jar")))) + + implementation(project(":core:common")) + implementation(project(":core:model")) + + implementation(Deps.Dagger.hiltAndroid) + kapt(Deps.Dagger.hiltAndroidCompiler) + + implementation(Deps.timber) + + testImplementation(Deps.Test.junit) + androidTestImplementation(Deps.Test.junitExt) + androidTestImplementation(Deps.Test.espresso) +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/matter/consumer-rules.pro b/examples/st-device-app/android/App/core/matter/consumer-rules.pro new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/examples/st-device-app/android/App/core/matter/proguard-rules.pro b/examples/st-device-app/android/App/core/matter/proguard-rules.pro new file mode 100644 index 00000000000000..481bb434814107 --- /dev/null +++ b/examples/st-device-app/android/App/core/matter/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/matter/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/core/matter/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..bbe718639154ef --- /dev/null +++ b/examples/st-device-app/android/App/core/matter/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.samsung.matter.chipstdeviceapp.core.matter + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.core.matter.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/matter/src/main/AndroidManifest.xml b/examples/st-device-app/android/App/core/matter/src/main/AndroidManifest.xml new file mode 100644 index 00000000000000..a5918e68abcdde --- /dev/null +++ b/examples/st-device-app/android/App/core/matter/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/MatterApi.kt b/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/MatterApi.kt new file mode 100644 index 00000000000000..f3f197893959dc --- /dev/null +++ b/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/MatterApi.kt @@ -0,0 +1,40 @@ +package com.samsung.matter.chipstdeviceapp.core.matter + +import chip.onboardingpayload.OnboardingPayloadException +import chip.onboardingpayload.OnboardingPayloadParser +import com.samsung.matter.chipstdeviceapp.core.matter.model.asSetupPayload +import com.samsung.matter.chipstdeviceapp.core.model.Payload +import timber.log.Timber +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class MatterApi @Inject constructor() { + + fun getQrcodeString(payload: Payload): String { + val onboardingPayloadParser = OnboardingPayloadParser() + var qrcode = "" + try { + qrcode = onboardingPayloadParser.getQrCodeFromPayload(payload.asSetupPayload()) + } catch (e: OnboardingPayloadException) { + e.printStackTrace() + } + + Timber.d("qrcode:$qrcode") + return qrcode + } + + fun getManualPairingCodeString(payload: Payload): String { + val onboardingPayloadParser = OnboardingPayloadParser() + var manualPairingCode = "" + try { + manualPairingCode = + onboardingPayloadParser.getManualPairingCodeFromPayload(payload.asSetupPayload()) + } catch (e: OnboardingPayloadException) { + e.printStackTrace() + } + + Timber.d("manualPairingCode:$manualPairingCode") + return manualPairingCode + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/model/Payload.kt b/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/model/Payload.kt new file mode 100644 index 00000000000000..0f0a9ad102013f --- /dev/null +++ b/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/model/Payload.kt @@ -0,0 +1,33 @@ +package com.samsung.matter.chipstdeviceapp.core.matter.model + +import chip.onboardingpayload.DiscoveryCapability +import chip.onboardingpayload.OnboardingPayload +import com.samsung.matter.chipstdeviceapp.core.common.MatterConstants +import com.samsung.matter.chipstdeviceapp.core.model.OnboardingType +import com.samsung.matter.chipstdeviceapp.core.model.Payload +import timber.log.Timber + +fun Payload.asSetupPayload(): OnboardingPayload { + val discoveryCapabilities = HashSet() + when (this.onboardingType) { + OnboardingType.WIFI -> discoveryCapabilities.add(DiscoveryCapability.ON_NETWORK) + OnboardingType.BLE -> discoveryCapabilities.add(DiscoveryCapability.BLE) + OnboardingType.WIFI_BLE -> { + discoveryCapabilities.add(DiscoveryCapability.ON_NETWORK) + discoveryCapabilities.add(DiscoveryCapability.BLE) + } + else -> { + Timber.e("Unknown Type") + } + } + + return OnboardingPayload( + MatterConstants.DEFAULT_VERSION, + MatterConstants.DEFAULT_VENDOR_ID, + productId, + MatterConstants.DEFAULT_COMMISSIONING_FLOW, + discoveryCapabilities, + discriminator, + MatterConstants.DEFAULT_SETUP_PINCODE + ) +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/matter/src/test/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleUnitTest.kt b/examples/st-device-app/android/App/core/matter/src/test/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleUnitTest.kt new file mode 100644 index 00000000000000..75a5dab709b73f --- /dev/null +++ b/examples/st-device-app/android/App/core/matter/src/test/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.samsung.matter.chipstdeviceapp.core.matter + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/model/.gitignore b/examples/st-device-app/android/App/core/model/.gitignore new file mode 100644 index 00000000000000..42afabfd2abebf --- /dev/null +++ b/examples/st-device-app/android/App/core/model/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/model/build.gradle.kts b/examples/st-device-app/android/App/core/model/build.gradle.kts new file mode 100644 index 00000000000000..0988bdf343526a --- /dev/null +++ b/examples/st-device-app/android/App/core/model/build.gradle.kts @@ -0,0 +1,44 @@ +import com.samsung.buildsrc.Deps +import com.samsung.buildsrc.Versions + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") +} + +android { + namespace = "com.samsung.matter.chipstdeviceapp.core.model" + compileSdk = Versions.compileSdkVersion + + defaultConfig { + minSdk = Versions.minSdkVersion + targetSdk = Versions.targetSdkVersion + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } +} + +dependencies { + + testImplementation(Deps.Test.junit) + androidTestImplementation(Deps.Test.junitExt) + androidTestImplementation(Deps.Test.espresso) +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/model/consumer-rules.pro b/examples/st-device-app/android/App/core/model/consumer-rules.pro new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/examples/st-device-app/android/App/core/model/proguard-rules.pro b/examples/st-device-app/android/App/core/model/proguard-rules.pro new file mode 100644 index 00000000000000..481bb434814107 --- /dev/null +++ b/examples/st-device-app/android/App/core/model/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/model/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/core/model/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..6cc5f2bda0d7ec --- /dev/null +++ b/examples/st-device-app/android/App/core/model/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.samsung.matter.chipstdeviceapp.core.model + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.core.model.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/model/src/main/AndroidManifest.xml b/examples/st-device-app/android/App/core/model/src/main/AndroidManifest.xml new file mode 100644 index 00000000000000..a5918e68abcdde --- /dev/null +++ b/examples/st-device-app/android/App/core/model/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/OnobardingType.kt b/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/OnobardingType.kt new file mode 100644 index 00000000000000..acc6f18cd1af3f --- /dev/null +++ b/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/OnobardingType.kt @@ -0,0 +1,12 @@ +package com.samsung.matter.chipstdeviceapp.core.model + +enum class OnboardingType { + WIFI, BLE, WIFI_BLE, UNKNOWN +} + +fun Int.asOnboardingType() = when (this) { + 0 -> OnboardingType.WIFI + 1 -> OnboardingType.BLE + 2 -> OnboardingType.WIFI_BLE + else -> OnboardingType.UNKNOWN +} diff --git a/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/Payload.kt b/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/Payload.kt new file mode 100644 index 00000000000000..c7e6697667b2b1 --- /dev/null +++ b/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/Payload.kt @@ -0,0 +1,7 @@ +package com.samsung.matter.chipstdeviceapp.core.model + +data class Payload( + val productId: Int, + val onboardingType: OnboardingType, + val discriminator: Int +) \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/model/src/test/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleUnitTest.kt b/examples/st-device-app/android/App/core/model/src/test/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleUnitTest.kt new file mode 100644 index 00000000000000..f954f4cf614caa --- /dev/null +++ b/examples/st-device-app/android/App/core/model/src/test/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.samsung.matter.chipstdeviceapp.core.model + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/.gitignore b/examples/st-device-app/android/App/feature/main/.gitignore new file mode 100644 index 00000000000000..42afabfd2abebf --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/build.gradle.kts b/examples/st-device-app/android/App/feature/main/build.gradle.kts new file mode 100644 index 00000000000000..83006ab81d2c2b --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/build.gradle.kts @@ -0,0 +1,69 @@ +import com.samsung.buildsrc.Deps +import com.samsung.buildsrc.Versions + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") + id("com.google.dagger.hilt.android") + id("androidx.navigation.safeargs.kotlin") + kotlin("kapt") +} + +android { + namespace = "com.samsung.matter.chipstdeviceapp.feature.main" + compileSdk = Versions.compileSdkVersion + + defaultConfig { + minSdk = Versions.minSdkVersion + targetSdk = Versions.targetSdkVersion + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + viewBinding = true + dataBinding = true + } +} + +dependencies { + + implementation(project(":core:common")) + implementation(project(":core:domain")) + implementation(project(":core:model")) + + implementation(Deps.AndroidX.core) + implementation(Deps.AndroidX.appcompat) + implementation(Deps.AndroidX.fragment) + + implementation(Deps.Kotlin.serialization) + + implementation(Deps.Navigation.fragment) + implementation(Deps.Navigation.ui) + + implementation(Deps.Dagger.hiltAndroid) + kapt(Deps.Dagger.hiltAndroidCompiler) + + implementation(Deps.timber) + + testImplementation(Deps.Test.junit) + androidTestImplementation(Deps.Test.junitExt) + androidTestImplementation(Deps.Test.espresso) +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/consumer-rules.pro b/examples/st-device-app/android/App/feature/main/consumer-rules.pro new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/examples/st-device-app/android/App/feature/main/proguard-rules.pro b/examples/st-device-app/android/App/feature/main/proguard-rules.pro new file mode 100644 index 00000000000000..481bb434814107 --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/feature/main/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..357b0c54b595c0 --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.samsung.matter.chipstdeviceapp.feature.main + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.feature.main.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/src/main/AndroidManifest.xml b/examples/st-device-app/android/App/feature/main/src/main/AndroidManifest.xml new file mode 100644 index 00000000000000..a5918e68abcdde --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/model/Menu.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/model/Menu.kt new file mode 100644 index 00000000000000..71e82d38dd22ba --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/model/Menu.kt @@ -0,0 +1,19 @@ +package com.samsung.matter.chipstdeviceapp.feature.main.model + +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import com.samsung.matter.chipstdeviceapp.core.common.Device +import com.samsung.matter.chipstdeviceapp.feature.main.R + +enum class Menu( + @DrawableRes val iconResId: Int, + @StringRes val titleResId: Int, + val isDim: Boolean = false, + val device: Device = Device.Unknown +) { + ON_OFF_SWITCH( + R.drawable.round_toggle_on_24, + R.string.samsung_on_off_switch, + device = Device.OnOffSwitch + ) +} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/MainFragment.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/MainFragment.kt new file mode 100644 index 00000000000000..efcebc086d236d --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/MainFragment.kt @@ -0,0 +1,126 @@ +package com.samsung.matter.chipstdeviceapp.feature.main.ui + +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.OnBackPressedCallback +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.LinearLayoutManager +import com.samsung.matter.chipstdeviceapp.core.common.DeepLink +import com.samsung.matter.chipstdeviceapp.core.common.MatterSettings +import com.samsung.matter.chipstdeviceapp.feature.main.R +import com.samsung.matter.chipstdeviceapp.feature.main.databinding.FragmentMainBinding +import com.samsung.matter.chipstdeviceapp.feature.main.model.Menu +import com.samsung.matter.chipstdeviceapp.feature.main.ui.adapter.MenuAdapter +import com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview.VerticalSpaceItemDecoration +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import timber.log.Timber +import kotlin.math.abs + +@AndroidEntryPoint +class MainFragment : Fragment() { + + private lateinit var binding: FragmentMainBinding + private lateinit var onBackPressedCallback: OnBackPressedCallback + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + Timber.d("Hit") + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false) + binding.lifecycleOwner = viewLifecycleOwner + + return binding.root + } + + @OptIn(ExperimentalSerializationApi::class) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + Timber.d("Hit") + super.onViewCreated(view, savedInstanceState) + + (activity as AppCompatActivity).setSupportActionBar(binding.toolbar) + (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) + + binding.appBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset -> + var ratio = 0F + if (abs(verticalOffset) != 0) { + ratio = abs(verticalOffset).toFloat() / appBarLayout.totalScrollRange.toFloat() + } + + binding.collapseTitle.alpha = 1f - ratio * 2f + 0.1f + binding.toolbarTitle.alpha = (ratio - 0.5f) * 2f + 0.1f + } + + val itemList = arrayListOf(Menu.ON_OFF_SWITCH) + + val menuAdapter = MenuAdapter(itemList, object : MenuAdapter.ItemHandler { + override fun onClick(item: Menu) { + val matterSettings = MatterSettings(device = item.device) + val jsonSettings = Json.encodeToString(matterSettings) + try { + findNavController().navigate( + DeepLink.getDeepLinkRequestForSetupFragment(jsonSettings) + ) + } catch (e: Exception) { + Timber.e(e, "navigate failure") + } + } + }) + + val sideSpace = resources.getDimension(R.dimen.menu_item_side_space).toInt() + val bottomSpace = resources.getDimension(R.dimen.menu_item_bottom_space).toInt() + + binding.recyclerView.apply { + layoutManager = LinearLayoutManager(requireContext()) + if (itemDecorationCount == 0) { + addItemDecoration( + VerticalSpaceItemDecoration( + sideSpace, + bottomSpace + ) + ) + } + adapter = menuAdapter + } + } + + override fun onResume() { + super.onResume() + Timber.d("onResume()") + } + + override fun onAttach(context: Context) { + Timber.d("Hit") + super.onAttach(context) + + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + Timber.d("handleOnBackPressed()") + requireActivity().finishAffinity() + } + } + + requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } + + override fun onDetach() { + super.onDetach() + Timber.d("onDetach()") + onBackPressedCallback.remove() + } + + override fun onDestroy() { + super.onDestroy() + Timber.d("onDestroy()") + } +} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/MenuAdapter.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/MenuAdapter.kt new file mode 100644 index 00000000000000..9b7c147fa347ad --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/MenuAdapter.kt @@ -0,0 +1,35 @@ +package com.samsung.matter.chipstdeviceapp.feature.main.ui.adapter + +import com.samsung.matter.chipstdeviceapp.feature.main.BR +import com.samsung.matter.chipstdeviceapp.feature.main.R +import com.samsung.matter.chipstdeviceapp.feature.main.model.Menu +import com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview.DataBindingViewHolder +import com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview.ItemDiffCallback +import com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview.ListBindingAdapter + + +internal class MenuAdapter( + menus: List

, + private val itemHandler: ItemHandler +) : ListBindingAdapter(ItemDiffCallback( + onItemsTheSame = { old, new -> old.titleResId == new.titleResId }, + onContentsTheSame = { old, new -> old == new } +)) { + + init { + submitList(menus) + } + + override fun getItemViewType(position: Int): Int { + return R.layout.item_menu + } + + override fun viewBindViewHolder(holder: DataBindingViewHolder, position: Int) { + super.viewBindViewHolder(holder, position) + holder.binding.setVariable(BR.itemHandler, itemHandler) + } + + interface ItemHandler { + fun onClick(item: Menu) + } +} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/ViewBindingAdapter.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/ViewBindingAdapter.kt new file mode 100644 index 00000000000000..7ea32ece9462ae --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/ViewBindingAdapter.kt @@ -0,0 +1,10 @@ +package com.samsung.matter.chipstdeviceapp.feature.main.ui.adapter + +import androidx.annotation.DrawableRes +import androidx.appcompat.widget.AppCompatImageView +import androidx.databinding.BindingAdapter + +@BindingAdapter("setSrc") +fun AppCompatImageView.bindSetSrc(@DrawableRes imgResId: Int) { + this.setImageResource(imgResId) +} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/DataBindingViewHolder.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/DataBindingViewHolder.kt new file mode 100644 index 00000000000000..b86afdc16c3970 --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/DataBindingViewHolder.kt @@ -0,0 +1,15 @@ +package com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview + +import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.RecyclerView +import com.samsung.matter.chipstdeviceapp.feature.main.BR + +class DataBindingViewHolder( + val binding: ViewDataBinding +) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: T) { + binding.setVariable(BR.item, item) + binding.executePendingBindings() + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ItemDiffCallback.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ItemDiffCallback.kt new file mode 100644 index 00000000000000..ff9cd039470e37 --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ItemDiffCallback.kt @@ -0,0 +1,14 @@ +package com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview + +import androidx.recyclerview.widget.DiffUtil + +class ItemDiffCallback( + val onItemsTheSame: (T, T) -> Boolean, + val onContentsTheSame: (T, T) -> Boolean +) : DiffUtil.ItemCallback() { + + override fun areItemsTheSame(oldItem: T, newItem: T): Boolean = onItemsTheSame(oldItem, newItem) + + override fun areContentsTheSame(oldItem: T, newItem: T): Boolean = + onContentsTheSame(oldItem, newItem) +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ListBindingAdapter.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ListBindingAdapter.kt new file mode 100644 index 00000000000000..35c53eaa133e30 --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ListBindingAdapter.kt @@ -0,0 +1,26 @@ +package com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter + +abstract class ListBindingAdapter(diffCallback: DiffUtil.ItemCallback) : + ListAdapter>(diffCallback) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataBindingViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = + DataBindingUtil.inflate(layoutInflater, viewType, parent, false) + return DataBindingViewHolder(binding) + } + + override fun onBindViewHolder(holder: DataBindingViewHolder, position: Int) { + viewBindViewHolder(holder, position) + holder.bind(getItem(position)) + } + + protected open fun viewBindViewHolder(holder: DataBindingViewHolder, position: Int) {} +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/VerticalSpaceItemDecoration.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/VerticalSpaceItemDecoration.kt new file mode 100644 index 00000000000000..387298e91157e2 --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/VerticalSpaceItemDecoration.kt @@ -0,0 +1,27 @@ +package com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview + +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView + +class VerticalSpaceItemDecoration( + private val sideSpace: Int, + private val bottomSpace: Int +) : RecyclerView.ItemDecoration() { + + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + parent.adapter?.let { adapter -> + if (parent.getChildAdapterPosition(view) != adapter.itemCount - 1) { + outRect.bottom = bottomSpace + } + + outRect.left = sideSpace + outRect.right = sideSpace + } + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/src/main/res/layout/fragment_main.xml b/examples/st-device-app/android/App/feature/main/src/main/res/layout/fragment_main.xml new file mode 100644 index 00000000000000..5faf9e48e23b77 --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/res/layout/fragment_main.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/st-device-app/android/App/feature/main/src/main/res/layout/item_menu.xml b/examples/st-device-app/android/App/feature/main/src/main/res/layout/item_menu.xml new file mode 100644 index 00000000000000..32d0d60dc2a0a2 --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/res/layout/item_menu.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/st-device-app/android/App/feature/main/src/main/res/navigation/main_nav_graph.xml b/examples/st-device-app/android/App/feature/main/src/main/res/navigation/main_nav_graph.xml new file mode 100644 index 00000000000000..e249c6146cb3ec --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/res/navigation/main_nav_graph.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/src/main/res/values/strings.xml b/examples/st-device-app/android/App/feature/main/src/main/res/values/strings.xml new file mode 100644 index 00000000000000..eced9a65286e1a --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + SmartThings Matter Device + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/src/test/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleUnitTest.kt b/examples/st-device-app/android/App/feature/main/src/test/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleUnitTest.kt new file mode 100644 index 00000000000000..616d34751a2b19 --- /dev/null +++ b/examples/st-device-app/android/App/feature/main/src/test/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.samsung.matter.chipstdeviceapp.feature.main + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/qrcode/.gitignore b/examples/st-device-app/android/App/feature/qrcode/.gitignore new file mode 100644 index 00000000000000..42afabfd2abebf --- /dev/null +++ b/examples/st-device-app/android/App/feature/qrcode/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/qrcode/build.gradle.kts b/examples/st-device-app/android/App/feature/qrcode/build.gradle.kts new file mode 100644 index 00000000000000..d413cc9fb9882c --- /dev/null +++ b/examples/st-device-app/android/App/feature/qrcode/build.gradle.kts @@ -0,0 +1,69 @@ +import com.samsung.buildsrc.Deps +import com.samsung.buildsrc.Versions + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") + id("com.google.dagger.hilt.android") + id("androidx.navigation.safeargs.kotlin") + kotlin("kapt") +} + +android { + namespace = "com.samsung.matter.chipstdeviceapp.feature.qrcode" + compileSdk = Versions.compileSdkVersion + + defaultConfig { + minSdk = Versions.minSdkVersion + targetSdk = Versions.targetSdkVersion + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + viewBinding = true + dataBinding = true + } +} + +dependencies { + + implementation(project(":core:common")) + implementation(project(":core:domain")) + implementation(project(":core:model")) + + implementation(Deps.AndroidX.core) + implementation(Deps.AndroidX.appcompat) + implementation(Deps.AndroidX.fragment) + + implementation(Deps.Kotlin.serialization) + + implementation(Deps.Navigation.fragment) + implementation(Deps.Navigation.ui) + + implementation(Deps.Dagger.hiltAndroid) + kapt(Deps.Dagger.hiltAndroidCompiler) + + implementation(Deps.timber) + + testImplementation(Deps.Test.junit) + androidTestImplementation(Deps.Test.junitExt) + androidTestImplementation(Deps.Test.espresso) +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/qrcode/consumer-rules.pro b/examples/st-device-app/android/App/feature/qrcode/consumer-rules.pro new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/examples/st-device-app/android/App/feature/qrcode/proguard-rules.pro b/examples/st-device-app/android/App/feature/qrcode/proguard-rules.pro new file mode 100644 index 00000000000000..481bb434814107 --- /dev/null +++ b/examples/st-device-app/android/App/feature/qrcode/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/qrcode/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/feature/qrcode/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..7434ac380ca3f3 --- /dev/null +++ b/examples/st-device-app/android/App/feature/qrcode/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleInstrumentedTest.kt @@ -0,0 +1,27 @@ +package com.samsung.matter.chipstdeviceapp.feature.qrcode + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals( + "com.samsung.matter.chipstdeviceapp.feature.qrcode.test", + appContext.packageName + ) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/AndroidManifest.xml b/examples/st-device-app/android/App/feature/qrcode/src/main/AndroidManifest.xml new file mode 100644 index 00000000000000..a5918e68abcdde --- /dev/null +++ b/examples/st-device-app/android/App/feature/qrcode/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt b/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt new file mode 100644 index 00000000000000..a1277e2bc82b44 --- /dev/null +++ b/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt @@ -0,0 +1,159 @@ +package com.samsung.matter.chipstdeviceapp.feature.qrcode + +import android.content.Context +import android.graphics.Bitmap +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.OnBackPressedCallback +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import com.samsung.matter.chipstdeviceapp.core.common.MatterConstants +import com.samsung.matter.chipstdeviceapp.core.common.MatterSettings +import com.samsung.matter.chipstdeviceapp.core.common.QrcodeUtil +import com.samsung.matter.chipstdeviceapp.feature.qrcode.databinding.FragmentQrcodeBinding +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import timber.log.Timber +import kotlin.math.abs + +@AndroidEntryPoint +class QrcodeFragment : Fragment() { + + private lateinit var binding: FragmentQrcodeBinding + private val viewModel by viewModels() + + private lateinit var onBackPressedCallback: OnBackPressedCallback + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + Timber.d("Hit") + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_qrcode, container, false) + binding.lifecycleOwner = viewLifecycleOwner + binding.viewModel = viewModel + + return binding.root + } + + @OptIn(ExperimentalSerializationApi::class) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + Timber.d("Hit") + super.onViewCreated(view, savedInstanceState) + + (activity as AppCompatActivity).setSupportActionBar(binding.toolbar) + (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) + + binding.appBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset -> + var ratio = 0F + if (abs(verticalOffset) != 0) { + ratio = abs(verticalOffset).toFloat() / appBarLayout.totalScrollRange.toFloat() + } + + binding.collapseTitle.alpha = 1f - ratio * 2f + 0.1f + binding.toolbarTitle.alpha = (ratio - 0.5f) * 2f + 0.1f + } + + val args: QrcodeFragmentArgs by navArgs() + val matterSettings = Json.decodeFromString(args.setting) + + viewModel.uiState.observe(viewLifecycleOwner) { + when (it) { + QrcodeUiState.Loading -> { + binding.progressBar.visibility = View.VISIBLE + } + is QrcodeUiState.Qrcode -> { + binding.progressBar.visibility = View.GONE + + binding.qrTypeImage.setImageResource(matterSettings.device.deviceIconResId) + binding.qrTypeTitle.text = getString(matterSettings.device.deviceNameResId) + + val qrCodeBitmap: Bitmap? = + QrcodeUtil.createQrCodeBitmap(it.qrCode, QR_WIDTH, QR_HEIGHT) + binding.qrImage.setImageBitmap(qrCodeBitmap) + + binding.qrText.text = getString(R.string.qrcode_qr_text, it.qrCode) + binding.manualCodeText.text = + getString(R.string.qrcode_manual_code_text, it.manualPairingCode) + binding.versionText.text = + getString( + R.string.qrcode_version_text, + MatterConstants.DEFAULT_VERSION.toString() + ) + binding.vendorIdText.text = getString( + R.string.qrcode_vendor_id_text, + MatterConstants.DEFAULT_VENDOR_ID.toString(), + MatterConstants.DEFAULT_VENDOR_ID.toString(16).uppercase() + ) + binding.productIdText.text = getString( + R.string.qrcode_product_id_text, + matterSettings.device.productId.toString(), + matterSettings.device.productId.toString(16).uppercase() + ) + binding.commissioningFlowText.text = getString( + R.string.qrcode_commissioning_flow_text, + MatterConstants.DEFAULT_COMMISSIONING_FLOW.toString() + ) + binding.onboardingTypeText.text = + getString( + R.string.qrcode_onboarding_type_text, + matterSettings.onboardingType + ) + binding.setupPinCodeText.text = getString( + R.string.qrcode_setup_pin_code_text, + MatterConstants.DEFAULT_SETUP_PINCODE.toString() + ) + binding.discriminatorText.text = getString( + R.string.qrcode_discriminator_text, + matterSettings.discriminator.toString(), + matterSettings.discriminator.toString(16).uppercase() + ) + } + } + } + } + + override fun onResume() { + Timber.d("Hit") + super.onResume() + } + + override fun onAttach(context: Context) { + Timber.d("Hit") + super.onAttach(context) + + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + Timber.d("handleOnBackPressed()") + findNavController().popBackStack() + } + } + + requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } + + override fun onDetach() { + Timber.d("Hit") + super.onDetach() + onBackPressedCallback.remove() + } + + override fun onDestroy() { + Timber.d("Hit") + super.onDestroy() + } + + companion object { + private const val QR_WIDTH = 450 + private const val QR_HEIGHT = 450 + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeViewModel.kt b/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeViewModel.kt new file mode 100644 index 00000000000000..8bbc12f6ea56d5 --- /dev/null +++ b/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeViewModel.kt @@ -0,0 +1,61 @@ +package com.samsung.matter.chipstdeviceapp.feature.qrcode + +import androidx.lifecycle.* +import com.samsung.matter.chipstdeviceapp.core.common.MatterSettings +import com.samsung.matter.chipstdeviceapp.core.common.successOr +import com.samsung.matter.chipstdeviceapp.core.domain.usecase.matter.GetManualPairingCodeStringUseCase +import com.samsung.matter.chipstdeviceapp.core.domain.usecase.matter.GetQrcodeStringUseCase +import com.samsung.matter.chipstdeviceapp.core.model.Payload +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import timber.log.Timber +import javax.inject.Inject + +@OptIn(ExperimentalSerializationApi::class) +@HiltViewModel +class QrcodeViewModel @Inject constructor( + private val getQrcodeStringUseCase: GetQrcodeStringUseCase, + private val getManualPairingCodeStringUseCase: GetManualPairingCodeStringUseCase, + savedStateHandle: SavedStateHandle +) : ViewModel() { + + private val _uiState = MutableLiveData(QrcodeUiState.Loading) + val uiState: LiveData get() = _uiState + + init { + viewModelScope.launch { + val jsonSettings = savedStateHandle.get("setting") + jsonSettings?.let { + val matterSettings = Json.decodeFromString(it) + + //TODO : start service + delay(500) + + val payload = Payload( + productId = matterSettings.device.productId.toInt(), + onboardingType = matterSettings.onboardingType, + discriminator = matterSettings.discriminator + ) + + val qrCode = getQrcodeStringUseCase(payload).successOr("") + val manualPairingCode = getManualPairingCodeStringUseCase(payload).successOr("") + + _uiState.value = QrcodeUiState.Qrcode(qrCode, manualPairingCode) + } + } + } + + override fun onCleared() { + super.onCleared() + Timber.d("onCleared()") + } +} + +sealed interface QrcodeUiState { + object Loading : QrcodeUiState + data class Qrcode(val qrCode: String, val manualPairingCode: String) : QrcodeUiState +} diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml b/examples/st-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml new file mode 100644 index 00000000000000..378fa4f5574cf6 --- /dev/null +++ b/examples/st-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/res/navigation/qrcode_nav_graph.xml b/examples/st-device-app/android/App/feature/qrcode/src/main/res/navigation/qrcode_nav_graph.xml new file mode 100644 index 00000000000000..1ba42ede1e135b --- /dev/null +++ b/examples/st-device-app/android/App/feature/qrcode/src/main/res/navigation/qrcode_nav_graph.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/res/values/strings.xml b/examples/st-device-app/android/App/feature/qrcode/src/main/res/values/strings.xml new file mode 100644 index 00000000000000..45e01e86e95660 --- /dev/null +++ b/examples/st-device-app/android/App/feature/qrcode/src/main/res/values/strings.xml @@ -0,0 +1,13 @@ + + + QR Code + QR Code : %1$s + Manual Pairing Code : %1$s + Version : %1$s + Vendor ID : %1$s (0x%2$s) + Product ID : %1$s (0x%2$s) + Commissioning Flow : %1$s + Onboarding Type : %1$s + Setup PinCode : %1$s\ + Discriminator : %1$s (0x%2$s) + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/qrcode/src/test/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleUnitTest.kt b/examples/st-device-app/android/App/feature/qrcode/src/test/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleUnitTest.kt new file mode 100644 index 00000000000000..c2ace440ac17e2 --- /dev/null +++ b/examples/st-device-app/android/App/feature/qrcode/src/test/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.samsung.matter.chipstdeviceapp.feature.qrcode + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/.gitignore b/examples/st-device-app/android/App/feature/setup/.gitignore new file mode 100644 index 00000000000000..42afabfd2abebf --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/build.gradle.kts b/examples/st-device-app/android/App/feature/setup/build.gradle.kts new file mode 100644 index 00000000000000..2cd8bba7c0e8bd --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/build.gradle.kts @@ -0,0 +1,69 @@ +import com.samsung.buildsrc.Deps +import com.samsung.buildsrc.Versions + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") + id("com.google.dagger.hilt.android") + id("androidx.navigation.safeargs.kotlin") + kotlin("kapt") +} + +android { + namespace = "com.samsung.matter.chipstdeviceapp.feature.setup" + compileSdk = Versions.compileSdkVersion + + defaultConfig { + minSdk = Versions.minSdkVersion + targetSdk = Versions.targetSdkVersion + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + viewBinding = true + dataBinding = true + } +} + +dependencies { + + implementation(project(":core:common")) + implementation(project(":core:domain")) + implementation(project(":core:model")) + + implementation(Deps.AndroidX.core) + implementation(Deps.AndroidX.appcompat) + implementation(Deps.AndroidX.fragment) + + implementation(Deps.Kotlin.serialization) + + implementation(Deps.Navigation.fragment) + implementation(Deps.Navigation.ui) + + implementation(Deps.Dagger.hiltAndroid) + kapt(Deps.Dagger.hiltAndroidCompiler) + + implementation(Deps.timber) + + testImplementation(Deps.Test.junit) + androidTestImplementation(Deps.Test.junitExt) + androidTestImplementation(Deps.Test.espresso) +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/consumer-rules.pro b/examples/st-device-app/android/App/feature/setup/consumer-rules.pro new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/examples/st-device-app/android/App/feature/setup/proguard-rules.pro b/examples/st-device-app/android/App/feature/setup/proguard-rules.pro new file mode 100644 index 00000000000000..481bb434814107 --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/feature/setup/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..22863e403a3a5a --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleInstrumentedTest.kt @@ -0,0 +1,27 @@ +package com.samsung.matter.chipstdeviceapp.feature.setup + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals( + "com.samsung.matter.chipstdeviceapp.feature.setup.test", + appContext.packageName + ) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/src/main/AndroidManifest.xml b/examples/st-device-app/android/App/feature/setup/src/main/AndroidManifest.xml new file mode 100644 index 00000000000000..a5918e68abcdde --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupFragment.kt b/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupFragment.kt new file mode 100644 index 00000000000000..9e2feac45ef934 --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupFragment.kt @@ -0,0 +1,170 @@ +package com.samsung.matter.chipstdeviceapp.feature.setup + +import android.os.Bundle +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import com.samsung.matter.chipstdeviceapp.core.common.DeepLink +import com.samsung.matter.chipstdeviceapp.core.common.MatterSettings +import com.samsung.matter.chipstdeviceapp.core.model.OnboardingType +import com.samsung.matter.chipstdeviceapp.feature.setup.databinding.DialogSetupContinueBinding +import com.samsung.matter.chipstdeviceapp.feature.setup.databinding.FragmentSetupBinding +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import timber.log.Timber +import kotlin.math.abs + +@AndroidEntryPoint +class SetupFragment : Fragment() { + + private lateinit var binding: FragmentSetupBinding + private val viewModel by viewModels() + + private lateinit var matterSettings: MatterSettings + private var ssid: String = "Unknown" + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + Timber.d("Hit") + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_setup, container, false) + binding.lifecycleOwner = viewLifecycleOwner + + return binding.root + } + + @OptIn(ExperimentalSerializationApi::class) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + Timber.d("Hit") + super.onViewCreated(view, savedInstanceState) + + (activity as AppCompatActivity).setSupportActionBar(binding.toolbar) + (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) + + binding.appBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset -> + var ratio = 0F + if (abs(verticalOffset) != 0) { + ratio = abs(verticalOffset).toFloat() / appBarLayout.totalScrollRange.toFloat() + } + + binding.collapseTitle.alpha = 1f - ratio * 2f + 0.1f + binding.toolbarTitle.alpha = (ratio - 0.5f) * 2f + 0.1f + } + + val args: SetupFragmentArgs by navArgs() + this.matterSettings = Json.decodeFromString(args.setting) + + binding.setupDeviceNameValueText.text = getString(matterSettings.device.deviceNameResId) + binding.setupDiscriminatorEditText.setText(matterSettings.device.discriminator.toString()) + + binding.setupSaveButton.setOnClickListener { + val discriminatorText = binding.setupDiscriminatorEditText.text.toString() + if (discriminatorText.isEmpty()) { + Toast.makeText( + requireActivity(), + getString(R.string.toast_discriminator), + Toast.LENGTH_LONG + ).show() + } else { + val discriminator = discriminatorText.toInt() + if (discriminator > DISCRIMINATOR_LIMIT) { + Toast.makeText( + requireActivity(), + getString(R.string.toast_discriminator), + Toast.LENGTH_LONG + ).show() + } else { + lifecycleScope.launch { + this@SetupFragment.ssid = viewModel.getSSID() + showConfirmDialog() + } + } + } + } + } + + @OptIn(ExperimentalSerializationApi::class) + private fun showConfirmDialog() { + Timber.d("Hit") + + val dialogBinding: DialogSetupContinueBinding = DataBindingUtil.inflate( + LayoutInflater.from(requireContext()), + R.layout.dialog_setup_continue, + null, + false + ) + + val confirmDialog = + AlertDialog.Builder(requireContext(), R.style.Theme_AppCompat_DayNight_Dialog_Alert) + .setView(dialogBinding.root) + .setCancelable(false) + .create() + + confirmDialog.window?.let { + it.setGravity(Gravity.BOTTOM) + it.setBackgroundDrawableResource(R.drawable.dialog_bg) + } + + dialogBinding.dialogSetupContinueTypeImage.setImageResource(this.matterSettings.device.deviceIconResId) + dialogBinding.dialogSetupContinueSsidText.text = + getString(R.string.setup_ssid_text, this.ssid) + dialogBinding.dialogSetupContinueDeviceNameText.text = + getString(this.matterSettings.device.deviceNameResId) + + val discriminator = binding.setupDiscriminatorEditText.text.toString() + dialogBinding.dialogSetupContinueDiscriminatorText.text = getString( + R.string.setup_discriminator_text, + getString(R.string.hint_discriminator), + discriminator + ) + + dialogBinding.dialogSetupCancelButton.setOnClickListener { + confirmDialog.dismiss() + } + + dialogBinding.dialogSetupStartButton.setOnClickListener { + confirmDialog.dismiss() + + val onboardingType = when (binding.setupOnboardingRadioGroup.checkedRadioButtonId) { + R.id.setup_onboarding_wifi_only -> OnboardingType.WIFI + R.id.setup_onboarding_ble_only -> OnboardingType.BLE + R.id.setup_onboarding_wifi_ble -> OnboardingType.WIFI_BLE + else -> OnboardingType.WIFI + } + Timber.d("MatterOnboardingType:$onboardingType") + this.matterSettings.onboardingType = onboardingType + this.matterSettings.discriminator = discriminator.toInt() + + val jsonSettings = Json.encodeToString(this.matterSettings) + try { + findNavController().navigate( + DeepLink.getDeepLinkRequestForQrcodeFragment(jsonSettings) + ) + } catch (e: Exception) { + Timber.e(e, "navigate failure") + } + } + + confirmDialog.show() + } + + companion object { + private const val DISCRIMINATOR_LIMIT = 4095 + } +} diff --git a/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupViewModel.kt b/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupViewModel.kt new file mode 100644 index 00000000000000..cedfe87b5dd12e --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupViewModel.kt @@ -0,0 +1,31 @@ +package com.samsung.matter.chipstdeviceapp.feature.setup + +import androidx.lifecycle.* +import com.samsung.matter.chipstdeviceapp.core.common.successOr +import com.samsung.matter.chipstdeviceapp.core.domain.usecase.network.GetSSIDUseCase +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.async +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class SetupViewModel @Inject constructor( + private val getSSIDUseCase: GetSSIDUseCase +) : ViewModel() { + + override fun onCleared() { + Timber.d("Hit") + super.onCleared() + } + + suspend fun getSSID(): String { + Timber.d("Hit") + val deferred = viewModelScope.async { + getSSIDUseCase().successOr("Unknown") + } + + val ssid = deferred.await() + Timber.d("ssid:${ssid}") + return ssid + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/drawable/dialog_bg.xml b/examples/st-device-app/android/App/feature/setup/src/main/res/drawable/dialog_bg.xml new file mode 100644 index 00000000000000..9df10627208772 --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/main/res/drawable/dialog_bg.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/drawable/round_notification_important_24.xml b/examples/st-device-app/android/App/feature/setup/src/main/res/drawable/round_notification_important_24.xml new file mode 100644 index 00000000000000..865cd172ba3a7c --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/main/res/drawable/round_notification_important_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/layout/dialog_setup_continue.xml b/examples/st-device-app/android/App/feature/setup/src/main/res/layout/dialog_setup_continue.xml new file mode 100644 index 00000000000000..0fc3db9ec27617 --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/main/res/layout/dialog_setup_continue.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/layout/fragment_setup.xml b/examples/st-device-app/android/App/feature/setup/src/main/res/layout/fragment_setup.xml new file mode 100644 index 00000000000000..7bf2118df30ac5 --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/main/res/layout/fragment_setup.xml @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/navigation/setup_nav_graph.xml b/examples/st-device-app/android/App/feature/setup/src/main/res/navigation/setup_nav_graph.xml new file mode 100644 index 00000000000000..647a075726dc12 --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/main/res/navigation/setup_nav_graph.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/values-ko/strings.xml b/examples/st-device-app/android/App/feature/setup/src/main/res/values-ko/strings.xml new file mode 100644 index 00000000000000..12cd411ca58c82 --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/main/res/values-ko/strings.xml @@ -0,0 +1,8 @@ + + + 동일한 Wi-Fi에 연결하세요 + SmartThings 앱/허브/디바이스 앱이 동일한 Wi-Fi 네크워크에 연결되어 있는지 확인해 주세요. + 저장 + 취소 + 시작 + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/values-night/colors.xml b/examples/st-device-app/android/App/feature/setup/src/main/res/values-night/colors.xml new file mode 100644 index 00000000000000..1a92e47e988de8 --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/main/res/values-night/colors.xml @@ -0,0 +1,5 @@ + + + #6E6E6E + #78C3FF + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/values/colors.xml b/examples/st-device-app/android/App/feature/setup/src/main/res/values/colors.xml new file mode 100644 index 00000000000000..d5b5d944f178d0 --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + @color/textColor + #D5E3FF + #0C548D + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/values/strings.xml b/examples/st-device-app/android/App/feature/setup/src/main/res/values/strings.xml new file mode 100644 index 00000000000000..59d5d2b474c8d0 --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/main/res/values/strings.xml @@ -0,0 +1,18 @@ + + + Setup + Device Name + Discriminator (Max:4095) + Discriminator + Wi-Fi + BLE + Wi-Fi/BLE + Connect to the same Wi-Fi network + Make sure your SmartThings App/Hub/Device App are connected to the same Wi-Fi network. + Save + Invalid input value + Cancel + Start + Wi-Fi : %1$s + %1$s : %2$s + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/src/test/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleUnitTest.kt b/examples/st-device-app/android/App/feature/setup/src/test/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleUnitTest.kt new file mode 100644 index 00000000000000..a6f97ceb22cd9d --- /dev/null +++ b/examples/st-device-app/android/App/feature/setup/src/test/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.samsung.matter.chipstdeviceapp.feature.setup + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/examples/st-device-app/android/App/gradle.properties b/examples/st-device-app/android/App/gradle.properties new file mode 100644 index 00000000000000..2b1bc98d5d7ccc --- /dev/null +++ b/examples/st-device-app/android/App/gradle.properties @@ -0,0 +1,28 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official + +# Build SDK from source code and debug in Android Stduio. Must also set matterBuildSrcDir. +matterSdkSourceBuild=false +# Point to the SDK build dir without quotes (out/android-arm64-chip-test for +# example) to build SDK from source code and debug in Android Studio. +# Set to blank to use the SDK prebuilt by scripts/build/build_examples.py. +matterBuildSrcDir=out/android-arm64-chip-st-device-app diff --git a/examples/st-device-app/android/App/gradle/wrapper/gradle-wrapper.properties b/examples/st-device-app/android/App/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000000..aed27c26b978a7 --- /dev/null +++ b/examples/st-device-app/android/App/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +#Fri Apr 08 15:38:34 KST 2022 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +android.injected.testOnly=false diff --git a/examples/st-device-app/android/App/gradlew b/examples/st-device-app/android/App/gradlew new file mode 100755 index 00000000000000..4f906e0c811fc9 --- /dev/null +++ b/examples/st-device-app/android/App/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/examples/st-device-app/android/App/gradlew.bat b/examples/st-device-app/android/App/gradlew.bat new file mode 100644 index 00000000000000..107acd32c4e687 --- /dev/null +++ b/examples/st-device-app/android/App/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/examples/st-device-app/android/App/settings.gradle.kts b/examples/st-device-app/android/App/settings.gradle.kts new file mode 100644 index 00000000000000..bd012ac2f702e1 --- /dev/null +++ b/examples/st-device-app/android/App/settings.gradle.kts @@ -0,0 +1,24 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} +rootProject.name = "CHIPStDeviceApp" +include(":app") +include(":core:common") +include(":core:data") +include(":core:domain") +include(":core:matter") +include(":core:model") +include(":feature:main") +include(":feature:qrcode") +include(":feature:setup") diff --git a/examples/st-device-app/android/BUILD.gn b/examples/st-device-app/android/BUILD.gn new file mode 100644 index 00000000000000..558101f047b660 --- /dev/null +++ b/examples/st-device-app/android/BUILD.gn @@ -0,0 +1,92 @@ +# Copyright (c) 2021 Project CHIP Authors +# +# 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("//build_overrides/build.gni") +import("//build_overrides/chip.gni") + +import("${build_root}/config/android_abi.gni") +import("${chip_root}/build/chip/java/rules.gni") +import("${chip_root}/build/chip/tools.gni") + +shared_library("jni") { + output_name = "libStDeviceApp" + + sources = [ + "${chip_root}/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h", + "java/AppImpl.cpp", + "java/AppImpl.h", + "java/ClusterChangeAttribute.cpp", + "java/JNIDACProvider.cpp", + "java/JNIDACProvider.h", + "java/OnOffManager.cpp", + "java/OnOffManager.h", + "java/StDeviceApp-JNI.cpp", + ] + + deps = [ + "${chip_root}/examples/platform/linux:commissioner-main", + "${chip_root}/examples/st-device-app/st-device-common", + "${chip_root}/src/app/server/java:jni", + "${chip_root}/src/lib", + "${chip_root}/src/lib/support/jsontlv", + "${chip_root}/third_party/inipp", + ] + + cflags = [ "-Wconversion" ] + + output_dir = "${root_out_dir}/lib/jni/${android_abi}" + + ldflags = [ "-Wl,--gc-sections" ] +} + +android_library("java") { + output_name = "StDeviceApp.jar" + + deps = [ + ":android", + "${chip_root}/third_party/android_deps:annotation", + ] + + data_deps = [ + ":jni", + "${chip_root}/build/chip/java:shared_cpplib", + ] + + sources = [ + "java/src/com/samsung/matter/stdeviceapp/DACProvider.java", + "java/src/com/samsung/matter/stdeviceapp/OnOffManager.java", + "java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java", + "java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java", + ] + + javac_flags = [ "-Xlint:deprecation" ] + + # TODO: add classpath support (we likely need to add something like + # ..../platforms/android-26/android.jar to access BLE items) +} + +java_prebuilt("android") { + jar_path = "${android_sdk_root}/platforms/android-26/android.jar" +} + +group("default") { + deps = [ + ":android", + ":java", + ":jni", + "${chip_root}/src/app/server/java", + "${chip_root}/src/controller/java:onboarding_payload", + "${chip_root}/src/platform/android:java", + ] +} diff --git a/examples/st-device-app/android/README.md b/examples/st-device-app/android/README.md new file mode 100644 index 00000000000000..5f20ca4731f52e --- /dev/null +++ b/examples/st-device-app/android/README.md @@ -0,0 +1,63 @@ +# Matter Android Device App Example + +This is a Matter Android Device app that can be used as a commissionee device. + +This app offers the following features: + +- Work as a commissionee device on Android environment +- Make custom payload information and display Matter QR code +- Provide UI for the user to change the cluster attribute values and create the cluster event + + +
+ +- [Matter Android Device App Example](#matter-android-device-app-example) + - [Requirements for building](#requirements-for-building) + - [Preparing for build](#preparing-for-build) + - [Building & Installing the app](#building--installing-the-app) + +
+ +
+ +## Requirements for building + +For information about how to build the application, see the +[Building Android](../../../docs/guides/android_building.md) guide. + +## Preparing for build + +Complete the following steps to prepare the Matter build: + +1. Check out the Matter repository. + +2. Run bootstrap (**only required first time**) + + ```shell + source scripts/bootstrap.sh + ``` + + + +## Building & Installing the app + +This is the simplest option. In the command line, run the following command from +the top Matter directory: + +```shell +./scripts/build/build_examples.py --target android-arm64-st-device-app build +``` + +See the table above for other values of `TARGET_CPU`. + +The debug Android package `app-debug.apk` will be generated at +`out/android-$TARGET_CPU-st-device-app/outputs/apk/debug/`, and can be +installed with + +```shell +adb install out/android-$TARGET_CPU-st-device-app/outputs/apk/debug/app-debug.apk +``` + +You can use Android Studio to edit the Android app itself and run it after +build_examples.py, but you will not be able to edit Matter Android code from +`src/controller/java`, or other Matter C++ code within Android Studio. diff --git a/examples/st-device-app/android/args.gni b/examples/st-device-app/android/args.gni new file mode 100644 index 00000000000000..b2ae2c18e499c5 --- /dev/null +++ b/examples/st-device-app/android/args.gni @@ -0,0 +1,29 @@ +# Copyright (c) 2020-2022 Project CHIP Authors +# +# 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("//build_overrides/chip.gni") + +import("${chip_root}/config/standalone/args.gni") + +chip_device_project_config_include = "" +chip_project_config_include = "" +chip_system_project_config_include = "" + +chip_project_config_include_dirs = + [ "${chip_root}/examples/st-device-app/st-device-common/include" ] +chip_project_config_include_dirs += [ "${chip_root}/config/standalone" ] + +chip_build_libshell = true + +chip_config_network_layer_ble = true diff --git a/examples/st-device-app/android/build_overrides b/examples/st-device-app/android/build_overrides new file mode 120000 index 00000000000000..e578e73312ebd1 --- /dev/null +++ b/examples/st-device-app/android/build_overrides @@ -0,0 +1 @@ +../../build_overrides \ No newline at end of file diff --git a/examples/st-device-app/android/java/AppImpl.cpp b/examples/st-device-app/android/java/AppImpl.cpp new file mode 100644 index 00000000000000..0863b22ea3a5bf --- /dev/null +++ b/examples/st-device-app/android/java/AppImpl.cpp @@ -0,0 +1,103 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * + * 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. + */ + +#include "AppImpl.h" +#include "StDeviceApp-JNI.h" + +#include +#include +#include +#include + +using namespace chip; +using namespace chip::DeviceLayer; + +void DeviceEventCallback(const ChipDeviceEvent * event, intptr_t arg) +{ + ChipLogProgress(DeviceLayer, "DeviceEventCallback : %d", event->Type); + + switch (event->Type) + { + case DeviceEventType::kWiFiConnectivityChange: + ChipLogProgress(DeviceLayer, "kWiFiConnectivityChange"); + break; + case DeviceEventType::kInternetConnectivityChange: + ChipLogProgress(DeviceLayer, "InternetConnectivityChange"); + break; + case DeviceEventType::kServiceConnectivityChange: + ChipLogProgress(DeviceLayer, "ServiceConnectivityChange"); + break; + case DeviceEventType::kServiceProvisioningChange: + ChipLogProgress(DeviceLayer, "ServiceProvisioningChange"); + break; + case DeviceEventType::kCHIPoBLEConnectionEstablished: + ChipLogProgress(DeviceLayer, "CHIPoBLE connection established"); + break; + case DeviceEventType::kCHIPoBLEConnectionClosed: + ChipLogProgress(DeviceLayer, "CHIPoBLE disconnected"); + break; + case DeviceEventType::kCHIPoBLEAdvertisingChange: + ChipLogProgress(DeviceLayer, "CHIPoBLEAdvertisingChange"); + break; + case DeviceEventType::kInterfaceIpAddressChanged: + ChipLogProgress(DeviceLayer, "InterfaceIpAddressChanged"); + break; + case DeviceEventType::kCommissioningComplete: + ChipLogProgress(DeviceLayer, "Commissioning complete"); + break; + case DeviceEventType::kOperationalNetworkEnabled: + ChipLogProgress(DeviceLayer, "OperationalNetworkEnabled"); + break; + case DeviceEventType::kDnssdInitialized: + ChipLogProgress(DeviceLayer, "DnssdPlatformInitialized"); + break; + } + + StDeviceAppJNIMgr().PostEvent(event->Type); +} + +static int kFabricRemoved = 0x9FFF; // out of public event range (0x8000) + +class FabricDelegate : public FabricTable::Delegate +{ + void OnFabricRemoved(const FabricTable & fabricTable, FabricIndex fabricIndex) override + { + ChipLogProgress(DeviceLayer, "OnFabricRemoved():FabricCount[%d],FabricIndex[%d]", fabricTable.FabricCount(), fabricIndex); + if (fabricTable.FabricCount() == 0) + { + StDeviceAppJNIMgr().PostEvent(kFabricRemoved); + } + } +}; + +static FabricDelegate gFabricDelegate; + +CHIP_ERROR PreServerInit() +{ + /** + * Apply any user-defined configurations prior to initializing Server. + * + * Ex. + * DnssdServer::Instance().SetExtendedDiscoveryTimeoutSecs(userTimeoutSecs); + * + */ + + chip::DeviceLayer::PlatformMgr().AddEventHandler(DeviceEventCallback, reinterpret_cast(nullptr)); + Server::GetInstance().GetFabricTable().AddFabricDelegate(&gFabricDelegate); + + return CHIP_NO_ERROR; +} \ No newline at end of file diff --git a/examples/st-device-app/android/java/AppImpl.h b/examples/st-device-app/android/java/AppImpl.h new file mode 100644 index 00000000000000..9b5446ae25f041 --- /dev/null +++ b/examples/st-device-app/android/java/AppImpl.h @@ -0,0 +1,23 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * 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. + */ + +#pragma once + +#include + +CHIP_ERROR PreServerInit(); diff --git a/examples/st-device-app/android/java/ClusterChangeAttribute.cpp b/examples/st-device-app/android/java/ClusterChangeAttribute.cpp new file mode 100644 index 00000000000000..2105881893b23d --- /dev/null +++ b/examples/st-device-app/android/java/ClusterChangeAttribute.cpp @@ -0,0 +1,56 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * 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. + */ + +#include "OnOffManager.h" +#include +#include +#include +#include +#include + +using namespace chip; +using namespace ::chip::app::Clusters; + +static void OnOffClusterAttributeChangeCallback(const app::ConcreteAttributePath & attributePath, uint16_t size, uint8_t * value) +{ + if (attributePath.mAttributeId == OnOff::Attributes::OnOff::Id) + { + bool onoff = static_cast(*value); + + ChipLogProgress(Zcl, "Received on/off command endpoint %d value = %d", static_cast(attributePath.mEndpointId), onoff); + + OnOffManager().PostOnOffChanged(attributePath.mEndpointId, onoff); + } +} + +void MatterPostAttributeChangeCallback(const app::ConcreteAttributePath & attributePath, uint8_t type, uint16_t size, + uint8_t * value) +{ + ChipLogProgress(Zcl, "[ST Device] clusterId:%d,attributeId:%d,endpoint:%d", + attributePath.mClusterId, attributePath.mAttributeId, static_cast(attributePath.mEndpointId)); + + switch (attributePath.mClusterId) + { + case OnOff::Id: + OnOffClusterAttributeChangeCallback(attributePath, size, value); + break; + + default: + break; + } +} diff --git a/examples/st-device-app/android/java/JNIDACProvider.cpp b/examples/st-device-app/android/java/JNIDACProvider.cpp new file mode 100644 index 00000000000000..d47db4ead12c5c --- /dev/null +++ b/examples/st-device-app/android/java/JNIDACProvider.cpp @@ -0,0 +1,172 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * + * 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. + */ + +#include "JNIDACProvider.h" +#include "lib/support/logging/CHIPLogging.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace chip; + +JNIDACProvider::JNIDACProvider(jobject provider) +{ + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for JNIDACProvider")); + + mJNIDACProviderObject = env->NewGlobalRef(provider); + VerifyOrReturn(mJNIDACProviderObject != nullptr, ChipLogError(Zcl, "Failed to NewGlobalRef JNIDACProvider")); + + jclass JNIDACProviderClass = env->GetObjectClass(provider); + VerifyOrReturn(JNIDACProviderClass != nullptr, ChipLogError(Zcl, "Failed to get JNIDACProvider Java class")); + + mGetCertificationDeclarationMethod = env->GetMethodID(JNIDACProviderClass, "GetCertificationDeclaration", "()[B"); + if (mGetCertificationDeclarationMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access JNIDACProvider 'GetCertificationDeclaration' method"); + env->ExceptionClear(); + } + + mGetFirmwareInformationMethod = env->GetMethodID(JNIDACProviderClass, "GetFirmwareInformation", "()[B"); + if (mGetFirmwareInformationMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access JNIDACProvider 'GetFirmwareInformation' method"); + env->ExceptionClear(); + } + + mGetDeviceAttestationCertMethod = env->GetMethodID(JNIDACProviderClass, "GetDeviceAttestationCert", "()[B"); + if (mGetDeviceAttestationCertMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access JNIDACProvider 'GetDeviceAttestationCert' method"); + env->ExceptionClear(); + } + + mGetProductAttestationIntermediateCertMethod = + env->GetMethodID(JNIDACProviderClass, "GetProductAttestationIntermediateCert", "()[B"); + if (mGetProductAttestationIntermediateCertMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access JNIDACProvider 'GetProductAttestationIntermediateCert' method"); + env->ExceptionClear(); + } + + mGetDeviceAttestationCertPrivateKeyMethod = env->GetMethodID(JNIDACProviderClass, "GetDeviceAttestationCertPrivateKey", "()[B"); + if (mGetDeviceAttestationCertPrivateKeyMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access JNIDACProvider 'GetDeviceAttestationCertPrivateKey' method"); + env->ExceptionClear(); + } + + mGetDeviceAttestationCertPublicKeyKeyMethod = + env->GetMethodID(JNIDACProviderClass, "GetDeviceAttestationCertPublicKeyKey", "()[B"); + if (mGetDeviceAttestationCertPublicKeyKeyMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access JNIDACProvider 'GetDeviceAttestationCertPublicKeyKey' method"); + env->ExceptionClear(); + } +} + +CHIP_ERROR JNIDACProvider::GetJavaByteByMethod(jmethodID method, MutableByteSpan & out_buffer) +{ + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnLogError(mJNIDACProviderObject != nullptr, CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnLogError(method != nullptr, CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnLogError(env != nullptr, CHIP_JNI_ERROR_NO_ENV); + + jbyteArray outArray = (jbyteArray) env->CallObjectMethod(mJNIDACProviderObject, method); + if (env->ExceptionCheck()) + { + ChipLogError(Zcl, "Java exception in get Method"); + env->ExceptionDescribe(); + env->ExceptionClear(); + return CHIP_ERROR_INCORRECT_STATE; + } + + if (outArray == nullptr || env->GetArrayLength(outArray) <= 0) + { + out_buffer.reduce_size(0); + return CHIP_NO_ERROR; + } + + JniByteArray JniOutArray(env, outArray); + return CopySpanToMutableSpan(JniOutArray.byteSpan(), out_buffer); +} + +CHIP_ERROR JNIDACProvider::GetCertificationDeclaration(MutableByteSpan & out_cd_buffer) +{ + ChipLogProgress(Zcl, "Received GetCertificationDeclaration"); + return GetJavaByteByMethod(mGetCertificationDeclarationMethod, out_cd_buffer); +} + +CHIP_ERROR JNIDACProvider::GetFirmwareInformation(MutableByteSpan & out_firmware_info_buffer) +{ + ChipLogProgress(Zcl, "Received GetFirmwareInformation"); + return GetJavaByteByMethod(mGetFirmwareInformationMethod, out_firmware_info_buffer); +} + +CHIP_ERROR JNIDACProvider::GetDeviceAttestationCert(MutableByteSpan & out_dac_buffer) +{ + ChipLogProgress(Zcl, "Received GetDeviceAttestationCert"); + return GetJavaByteByMethod(mGetDeviceAttestationCertMethod, out_dac_buffer); +} + +CHIP_ERROR JNIDACProvider::GetProductAttestationIntermediateCert(MutableByteSpan & out_pai_buffer) +{ + ChipLogProgress(Zcl, "Received GetProductAttestationIntermediateCert"); + return GetJavaByteByMethod(mGetProductAttestationIntermediateCertMethod, out_pai_buffer); +} + +// TODO: This should be moved to a method of P256Keypair +CHIP_ERROR LoadKeypairFromRaw(ByteSpan private_key, ByteSpan public_key, Crypto::P256Keypair & keypair) +{ + Crypto::P256SerializedKeypair serialized_keypair; + ReturnErrorOnFailure(serialized_keypair.SetLength(private_key.size() + public_key.size())); + memcpy(serialized_keypair.Bytes(), public_key.data(), public_key.size()); + memcpy(serialized_keypair.Bytes() + public_key.size(), private_key.data(), private_key.size()); + return keypair.Deserialize(serialized_keypair); +} + +CHIP_ERROR JNIDACProvider::SignWithDeviceAttestationKey(const ByteSpan & digest_to_sign, MutableByteSpan & out_signature_buffer) +{ + ChipLogProgress(Zcl, "Received SignWithDeviceAttestationKey"); + Crypto::P256ECDSASignature signature; + Crypto::P256Keypair keypair; + + VerifyOrReturnError(IsSpanUsable(out_signature_buffer), CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnError(IsSpanUsable(digest_to_sign), CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnError(out_signature_buffer.size() >= signature.Capacity(), CHIP_ERROR_BUFFER_TOO_SMALL); + + uint8_t privateKeyBuf[Crypto::kP256_PrivateKey_Length]; + MutableByteSpan privateKeyBufSpan(privateKeyBuf); + ReturnErrorOnFailure(GetJavaByteByMethod(mGetDeviceAttestationCertPrivateKeyMethod, privateKeyBufSpan)); + + uint8_t publicKeyBuf[Crypto::kP256_PublicKey_Length]; + MutableByteSpan publicKeyBufSpan(publicKeyBuf); + ReturnErrorOnFailure(GetJavaByteByMethod(mGetDeviceAttestationCertPublicKeyKeyMethod, publicKeyBufSpan)); + + // In a non-exemplary implementation, the public key is not needed here. It is used here merely because + // Crypto::P256Keypair is only (currently) constructable from raw keys if both private/public keys are present. + ReturnErrorOnFailure(LoadKeypairFromRaw(privateKeyBufSpan, publicKeyBufSpan, keypair)); + ReturnErrorOnFailure(keypair.ECDSA_sign_msg(digest_to_sign.data(), digest_to_sign.size(), signature)); + + return CopySpanToMutableSpan(ByteSpan{ signature.ConstBytes(), signature.Length() }, out_signature_buffer); +} diff --git a/examples/st-device-app/android/java/JNIDACProvider.h b/examples/st-device-app/android/java/JNIDACProvider.h new file mode 100644 index 00000000000000..a9181dc59295b3 --- /dev/null +++ b/examples/st-device-app/android/java/JNIDACProvider.h @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * + * 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. + */ +#pragma once + +#include "lib/support/logging/CHIPLogging.h" +#include +#include + +class JNIDACProvider : public chip::Credentials::DeviceAttestationCredentialsProvider +{ +public: + JNIDACProvider(jobject provider); + CHIP_ERROR GetCertificationDeclaration(chip::MutableByteSpan & out_cd_buffer) override; + CHIP_ERROR GetFirmwareInformation(chip::MutableByteSpan & out_firmware_info_buffer) override; + CHIP_ERROR GetDeviceAttestationCert(chip::MutableByteSpan & out_dac_buffer) override; + CHIP_ERROR GetProductAttestationIntermediateCert(chip::MutableByteSpan & out_pai_buffer) override; + CHIP_ERROR SignWithDeviceAttestationKey(const chip::ByteSpan & digest_to_sign, + chip::MutableByteSpan & out_signature_buffer) override; + +private: + CHIP_ERROR GetJavaByteByMethod(jmethodID method, chip::MutableByteSpan & out_buffer); + jobject mJNIDACProviderObject = nullptr; + jmethodID mGetCertificationDeclarationMethod = nullptr; + jmethodID mGetFirmwareInformationMethod = nullptr; + jmethodID mGetDeviceAttestationCertMethod = nullptr; + jmethodID mGetProductAttestationIntermediateCertMethod = nullptr; + jmethodID mGetDeviceAttestationCertPrivateKeyMethod = nullptr; + jmethodID mGetDeviceAttestationCertPublicKeyKeyMethod = nullptr; +}; diff --git a/examples/st-device-app/android/java/OnOffManager.cpp b/examples/st-device-app/android/java/OnOffManager.cpp new file mode 100644 index 00000000000000..08ce45eb817aa4 --- /dev/null +++ b/examples/st-device-app/android/java/OnOffManager.cpp @@ -0,0 +1,129 @@ +/** + * + * Copyright (c) 2022 Project CHIP Authors + * + * 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. + */ +#include "OnOffManager.h" +#include "StDeviceApp-JNI.h" +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace chip; + +static constexpr size_t kOnffManagerTableSize = EMBER_AF_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT; + +namespace { + +OnOffManager * gOnOffManagerTable[kOnffManagerTableSize] = { nullptr }; +static_assert(kOnffManagerTableSize <= kEmberInvalidEndpointIndex, "gOnOffManagerTable table size error"); + +} // namespace + +void emberAfOnOffClusterInitCallback(EndpointId endpoint) +{ + ChipLogProgress(Zcl, "ST Device App::OnOff::PostClusterInit"); + StDeviceAppJNIMgr().PostClusterInit(chip::app::Clusters::OnOff::Id, endpoint); +} + +void OnOffManager::NewManager(jint endpoint, jobject manager) +{ + ChipLogProgress(Zcl, "ST Device App: OnOffManager::NewManager"); + uint16_t ep = emberAfGetClusterServerEndpointIndex(static_cast(endpoint), app::Clusters::OnOff::Id, + EMBER_AF_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT); + VerifyOrReturn(ep < kOnffManagerTableSize, + ChipLogError(Zcl, "ST Device App::OnOff::NewManager: endpoint %d not found", endpoint)); + + VerifyOrReturn(gOnOffManagerTable[ep] == nullptr, + ChipLogError(Zcl, "ST Device App::OnOff::NewManager: endpoint %d already has a manager", endpoint)); + OnOffManager * mgr = new OnOffManager(); + CHIP_ERROR err = mgr->InitializeWithObjects(manager); + if (err != CHIP_NO_ERROR) + { + ChipLogError(Zcl, "ST Device App::OnOff::NewManager: failed to initialize manager for endpoint %d", endpoint); + delete mgr; + } + else + { + gOnOffManagerTable[ep] = mgr; + } +} + +OnOffManager * GetOnOffManager(EndpointId endpoint) +{ + uint16_t ep = + emberAfGetClusterServerEndpointIndex(endpoint, app::Clusters::OnOff::Id, EMBER_AF_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT); + return (ep >= kOnffManagerTableSize ? nullptr : gOnOffManagerTable[ep]); +} + +void OnOffManager::PostOnOffChanged(chip::EndpointId endpoint, bool value) +{ + ChipLogProgress(Zcl, "ST Device App: OnOffManager::PostOnOffChange"); + OnOffManager * mgr = GetOnOffManager(endpoint); + VerifyOrReturn(mgr != nullptr, ChipLogError(Zcl, "OnOffManager null")); + + mgr->HandleOnOffChanged(value); +} + +jboolean OnOffManager::SetOnOff(jint endpoint, bool value) +{ + EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(static_cast(endpoint), value); + return status == EMBER_ZCL_STATUS_SUCCESS; +} + +CHIP_ERROR OnOffManager::InitializeWithObjects(jobject managerObject) +{ + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnLogError(env != nullptr, CHIP_ERROR_INCORRECT_STATE); + + mOnOffManagerObject = env->NewGlobalRef(managerObject); + VerifyOrReturnLogError(mOnOffManagerObject != nullptr, CHIP_ERROR_INVALID_ARGUMENT); + + jclass OnOffManagerClass = env->GetObjectClass(managerObject); + VerifyOrReturnLogError(OnOffManagerClass != nullptr, CHIP_ERROR_INVALID_ARGUMENT); + + mHandleOnOffChangedMethod = env->GetMethodID(OnOffManagerClass, "HandleOnOffChanged", "(Z)V"); + if (mHandleOnOffChangedMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access OnOffManager 'HandleOnOffChanged' method"); + env->ExceptionClear(); + return CHIP_ERROR_INVALID_ARGUMENT; + } + + return CHIP_NO_ERROR; +} + +void OnOffManager::HandleOnOffChanged(bool value) +{ + ChipLogProgress(Zcl, "OnOffManager::HandleOnOffChanged"); + + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturn(env != NULL, ChipLogProgress(Zcl, "env null")); + VerifyOrReturn(mOnOffManagerObject != nullptr, ChipLogProgress(Zcl, "mOnOffManagerObject null")); + VerifyOrReturn(mHandleOnOffChangedMethod != nullptr, ChipLogProgress(Zcl, "mHandleOnOffChangedMethod null")); + + env->ExceptionClear(); + env->CallVoidMethod(mOnOffManagerObject, mHandleOnOffChangedMethod, static_cast(value)); + if (env->ExceptionCheck()) + { + ChipLogError(AppServer, "Java exception in OnOffManager::HandleOnOffChanged"); + env->ExceptionDescribe(); + env->ExceptionClear(); + } +} diff --git a/examples/st-device-app/android/java/OnOffManager.h b/examples/st-device-app/android/java/OnOffManager.h new file mode 100644 index 00000000000000..02420b8fd14dd3 --- /dev/null +++ b/examples/st-device-app/android/java/OnOffManager.h @@ -0,0 +1,45 @@ +/* + * + * Copyright (c) 2022 Project CHIP Authors + * + * 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. + */ +#pragma once + +#include +#include + +/** + * @brief Handles interfacing between java code and C++ code for the purposes of On/Off clusters. + */ +class OnOffManager +{ +public: + // installed a bridege for a On/Off cluster endpoint and java object + static void NewManager(jint endpoint, jobject manager); + + // helps for java to set attributes::OnOff of OnOff cluster + static jboolean SetOnOff(jint endpoint, bool value); + + // posts a OnOffChanged event to suitable OnOffManager + static void PostOnOffChanged(chip::EndpointId endpoint, bool value); + + // handles `Changed` callbacks by calling the java `void HandleOnOffChanged()` method + void HandleOnOffChanged(bool value); + +private: + // init with java objects + CHIP_ERROR InitializeWithObjects(jobject managerObject); + jobject mOnOffManagerObject = nullptr; + jmethodID mHandleOnOffChangedMethod = nullptr; +}; diff --git a/examples/st-device-app/android/java/StDeviceApp-JNI.cpp b/examples/st-device-app/android/java/StDeviceApp-JNI.cpp new file mode 100644 index 00000000000000..15d36640d66f48 --- /dev/null +++ b/examples/st-device-app/android/java/StDeviceApp-JNI.cpp @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * 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. + * + */ + +#include "StDeviceApp-JNI.h" +#include "AppImpl.h" +#include "JNIDACProvider.h" + +#include "OnOffManager.h" +#include "credentials/DeviceAttestationCredsProvider.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace chip; +using namespace chip::app; +using namespace chip::app::Clusters; +using namespace chip::AppPlatform; +using namespace chip::Credentials; +using namespace chip::DeviceLayer; + +#define JNI_METHOD(RETURN, METHOD_NAME) \ + extern "C" JNIEXPORT RETURN JNICALL Java_com_samsung_matter_stdeviceapp_StDeviceApp_##METHOD_NAME + +#define DEVICE_VERSION_DEFAULT 1 + +EmberAfDeviceType gDeviceTypeIds[] = { { 0, DEVICE_VERSION_DEFAULT } }; +StDeviceAppJNI StDeviceAppJNI::sInstance; + +void StDeviceAppJNI::InitializeWithObjects(jobject app) +{ + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for StDeviceAppJNI")); + + mStDeviceAppObject = env->NewGlobalRef(app); + VerifyOrReturn(mStDeviceAppObject != nullptr, ChipLogError(Zcl, "Failed to NewGlobalRef StDeviceAppJNI")); + + jclass managerClass = env->GetObjectClass(mStDeviceAppObject); + VerifyOrReturn(managerClass != nullptr, ChipLogError(Zcl, "Failed to get StDeviceAppJNI Java class")); + + mPostClusterInitMethod = env->GetMethodID(managerClass, "postClusterInit", "(II)V"); + if (mPostClusterInitMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access StDeviceApp 'postClusterInit' method"); + env->ExceptionClear(); + } + + mPostEventMethod = env->GetMethodID(managerClass, "postEvent", "(I)V"); + if (mPostEventMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access StDeviceApp 'postEvent' method"); + env->ExceptionClear(); + } +} + +void StDeviceAppJNI::PostClusterInit(int clusterId, int endpoint) +{ + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for StDeviceAppJNI::PostClusterInit")); + VerifyOrReturn(mStDeviceAppObject != nullptr, ChipLogError(Zcl, "StDeviceAppJNI::mStDeviceAppObject null")); + VerifyOrReturn(mPostClusterInitMethod != nullptr, ChipLogError(Zcl, "StDeviceAppJNI::mPostClusterInitMethod null")); + + env->CallVoidMethod(mStDeviceAppObject, mPostClusterInitMethod, static_cast(clusterId), static_cast(endpoint)); + if (env->ExceptionCheck()) + { + ChipLogError(Zcl, "Failed to call StDeviceAppJNI 'postClusterInit' method"); + env->ExceptionClear(); + } +} + +void StDeviceAppJNI::PostEvent(int event) +{ + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for StDeviceAppJNI::PostEvent")); + VerifyOrReturn(mStDeviceAppObject != nullptr, ChipLogError(Zcl, "StDeviceAppJNI::mStDeviceAppObject null")); + VerifyOrReturn(mPostEventMethod != nullptr, ChipLogError(Zcl, "StDeviceAppJNI::mPostEventMethod null")); + + env->CallVoidMethod(mStDeviceAppObject, mPostEventMethod, static_cast(event)); + if (env->ExceptionCheck()) + { + ChipLogError(Zcl, "Failed to call StDeviceAppJNI 'postEventMethod' method"); + env->ExceptionClear(); + } +} + +jint JNI_OnLoad(JavaVM * jvm, void * reserved) +{ + return AndroidAppServerJNI_OnLoad(jvm, reserved); +} + +void JNI_OnUnload(JavaVM * jvm, void * reserved) +{ + return AndroidAppServerJNI_OnUnload(jvm, reserved); +} + +JNI_METHOD(void, nativeInit)(JNIEnv *, jobject app) +{ + StDeviceAppJNIMgr().InitializeWithObjects(app); +} + +JNI_METHOD(void, preServerInit)(JNIEnv *, jobject app) +{ + chip::DeviceLayer::StackLock lock; + ChipLogProgress(Zcl, "StDeviceAppJNI::preServerInit"); + + PreServerInit(); +} + +JNI_METHOD(void, postServerInit)(JNIEnv *, jobject app, jint deviceTypeId) +{ + chip::DeviceLayer::StackLock lock; + ChipLogProgress(Zcl, "StDeviceAppJNI::postServerInit"); + + gDeviceTypeIds[0].deviceId = static_cast(deviceTypeId); + emberAfSetDeviceTypeList(1, Span(gDeviceTypeIds)); +} + +JNI_METHOD(void, setDACProvider)(JNIEnv *, jobject, jobject provider) +{ + if (!chip::Credentials::IsDeviceAttestationCredentialsProviderSet()) + { + JNIDACProvider * p = new JNIDACProvider(provider); + chip::Credentials::SetDeviceAttestationCredentialsProvider(p); + } +} + +/* + * On Off Manager + */ +JNI_METHOD(void, setOnOffManager)(JNIEnv *, jobject, jint endpoint, jobject manager) +{ + OnOffManager::NewManager(endpoint, manager); +} + +JNI_METHOD(jboolean, setOnOff)(JNIEnv *, jobject, jint endpoint, jboolean value) +{ + return DeviceLayer::SystemLayer().ScheduleLambda([endpoint, value] { OnOffManager::SetOnOff(endpoint, value); }) == + CHIP_NO_ERROR; +} diff --git a/examples/st-device-app/android/java/StDeviceApp-JNI.h b/examples/st-device-app/android/java/StDeviceApp-JNI.h new file mode 100644 index 00000000000000..caf12a96b6f5e1 --- /dev/null +++ b/examples/st-device-app/android/java/StDeviceApp-JNI.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * 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. + */ + +#pragma once + +#include + +class StDeviceAppJNI +{ +public: + void InitializeWithObjects(jobject app); + void PostClusterInit(int clusterId, int endpoint); + void PostEvent(int event); + +private: + friend StDeviceAppJNI & StDeviceAppJNIMgr(); + + static StDeviceAppJNI sInstance; + jobject mStDeviceAppObject = nullptr; + jmethodID mPostClusterInitMethod = nullptr; + jmethodID mPostEventMethod = nullptr; +}; + +inline class StDeviceAppJNI & StDeviceAppJNIMgr() +{ + return StDeviceAppJNI::sInstance; +} diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/DACProvider.java b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/DACProvider.java new file mode 100644 index 00000000000000..0cd77c5dc78415 --- /dev/null +++ b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/DACProvider.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * 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. + * + */ +package com.samsung.matter.stdeviceapp; + +public interface DACProvider { + byte[] GetCertificationDeclaration(); + + byte[] GetFirmwareInformation(); + + byte[] GetDeviceAttestationCert(); + + byte[] GetProductAttestationIntermediateCert(); + + byte[] GetDeviceAttestationCertPrivateKey(); + + byte[] GetDeviceAttestationCertPublicKeyKey(); +} diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/OnOffManager.java b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/OnOffManager.java new file mode 100644 index 00000000000000..290c7430a4f050 --- /dev/null +++ b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/OnOffManager.java @@ -0,0 +1,12 @@ +package com.samsung.matter.stdeviceapp; + +public interface OnOffManager { + /** + * Notify that the OnOff value be changed by matter and should effect it. Note, + * set by TvApp will + * also trigger this function, so must check if value is same + * + * @param value + */ + void HandleOnOffChanged(boolean value); +} diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java new file mode 100644 index 00000000000000..4f3b135a3e4d54 --- /dev/null +++ b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * 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. + * + */ +package com.samsung.matter.stdeviceapp; + +import android.util.Log; + +public class StDeviceApp { + private StDeviceAppCallback mCallback; + private static final String TAG = "StDeviceApp"; + + public StDeviceApp(StDeviceAppCallback callback) { + mCallback = callback; + nativeInit(); + } + + private void postClusterInit(int clusterId, int endpoint) { + Log.d(TAG, "postClusterInit for " + clusterId + " at " + endpoint); + if (mCallback != null) { + mCallback.onClusterInit(this, clusterId, endpoint); + } + } + + private void postEvent(int event) { + Log.d(TAG, "postEvent : " + event); + if (mCallback != null) { + mCallback.onEvent(event); + } + } + + public native void nativeInit(); + + // called before Matter server is inited + public native void preServerInit(); + + // called after Matter server is inited + public native void postServerInit(int deviceTypeId); + + public native void setOnOffManager(int endpoint, OnOffManager manager); + + public native boolean setOnOff(int endpoint, boolean value); + + public native void setDACProvider(DACProvider provider); + + static { + System.loadLibrary("StDeviceApp"); + } +} diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java new file mode 100644 index 00000000000000..9fa7813e743151 --- /dev/null +++ b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java @@ -0,0 +1,22 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * + * 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. + */ +package com.samsung.matter.stdeviceapp; + +public interface StDeviceAppCallback { + void onClusterInit(StDeviceApp app, int clusterId, int endpoint); + void onEvent(int event); +} diff --git a/examples/st-device-app/android/third_party/connectedhomeip b/examples/st-device-app/android/third_party/connectedhomeip new file mode 120000 index 00000000000000..11a54ed360106c --- /dev/null +++ b/examples/st-device-app/android/third_party/connectedhomeip @@ -0,0 +1 @@ +../../../../ \ No newline at end of file diff --git a/examples/st-device-app/st-device-common/BUILD.gn b/examples/st-device-app/st-device-common/BUILD.gn new file mode 100644 index 00000000000000..1b14c8b656df06 --- /dev/null +++ b/examples/st-device-app/st-device-common/BUILD.gn @@ -0,0 +1,25 @@ +# Copyright (c) 2020 Project CHIP Authors +# +# 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("//build_overrides/chip.gni") + +import("${chip_root}/src/app/chip_data_model.gni") +import("${chip_root}/src/lib/lib.gni") + +chip_data_model("st-device-common") { + zap_file = "st-device-app.zap" + + zap_pregenerated_dir = "${chip_root}/zzz_generated/st-device-app/zap-generated" + is_server = true +} diff --git a/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h b/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h new file mode 100644 index 00000000000000..2426d10ca4ec7c --- /dev/null +++ b/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h @@ -0,0 +1,67 @@ +/* + * + * Copyright (c) 2020 Project CHIP Authors + * All rights reserved. + * + * 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. + */ + +/** + * @file + * Example project configuration file for CHIP. + * + * This is a place to put application or project-specific overrides + * to the default configuration values for general CHIP features. + * + */ + +#pragma once + +// TVs need to be commissioners and likely want to be discoverable +#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY 0 + +// TVs that are not commissionees, +// or that don't automatically enter commissioning mode should set this to 0 +#define CHIP_DEVICE_CONFIG_ENABLE_PAIRING_AUTOSTART 1 + +// TVs do not typically need this - enable for debugging +// #define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT 1 + +// Enable extended discovery, set timeout to 24 hours +#define CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY 0 +#define CHIP_DEVICE_CONFIG_EXTENDED_DISCOVERY_TIMEOUT_SECS (24 * 60 * 60) + +// Advertise TV device type in DNS-SD +#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_TYPE 1 + +#define CHIP_DEVICE_CONFIG_DEVICE_TYPE 0 // 0x0023 = 35 = Video Player + +#define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID 0xFFF1 + +// Include device name in discovery for casting use case +#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_NAME 1 +#define CHIP_DEVICE_CONFIG_DEVICE_NAME "Matter Device" + +// Enable app platform +#define CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED 0 + +// overrides CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT in CHIPProjectConfig +#define CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT 16 + +// For casting, we need to allow more ACL entries, and more complex entries +#define CHIP_CONFIG_EXAMPLE_ACCESS_CONTROL_MAX_TARGETS_PER_ENTRY 20 +#define CHIP_CONFIG_EXAMPLE_ACCESS_CONTROL_MAX_SUBJECTS_PER_ENTRY 20 +#define CHIP_CONFIG_EXAMPLE_ACCESS_CONTROL_MAX_ENTRIES_PER_FABRIC 20 + +// include the CHIPProjectConfig from config/standalone +#include diff --git a/examples/st-device-app/st-device-common/st-device-app.matter b/examples/st-device-app/st-device-common/st-device-app.matter new file mode 100644 index 00000000000000..aaf95e4e78325a --- /dev/null +++ b/examples/st-device-app/st-device-common/st-device-app.matter @@ -0,0 +1,2211 @@ +// This IDL was generated automatically by ZAP. +// It is for view/code review purposes only. + +struct LabelStruct { + char_string<16> label = 0; + char_string<16> value = 1; +} + +/** Attributes and commands for putting a device into Identification mode (e.g. flashing a light). */ +server cluster Identify = 3 { + enum IdentifyEffectIdentifier : ENUM8 { + kBlink = 0; + kBreathe = 1; + kOkay = 2; + kChannelChange = 11; + kFinishEffect = 254; + kStopEffect = 255; + } + + enum IdentifyEffectVariant : ENUM8 { + kDefault = 0; + } + + enum IdentifyIdentifyType : ENUM8 { + kNone = 0; + kVisibleLight = 1; + kVisibleLED = 2; + kAudibleBeep = 3; + kDisplay = 4; + kActuator = 5; + } + + attribute int16u identifyTime = 0; + readonly attribute enum8 identifyType = 1; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct IdentifyRequest { + INT16U identifyTime = 0; + } + + request struct TriggerEffectRequest { + IdentifyEffectIdentifier effectIdentifier = 0; + IdentifyEffectVariant effectVariant = 1; + } + + command access(invoke: manage) Identify(IdentifyRequest): DefaultSuccess = 0; + command access(invoke: manage) TriggerEffect(TriggerEffectRequest): DefaultSuccess = 64; +} + +/** Attributes and commands for group configuration and manipulation. */ +server cluster Groups = 4 { + bitmap GroupsFeature : BITMAP32 { + kGroupNames = 0x1; + } + + readonly attribute bitmap8 nameSupport = 0; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct AddGroupRequest { + group_id groupID = 0; + CHAR_STRING groupName = 1; + } + + request struct ViewGroupRequest { + group_id groupID = 0; + } + + request struct GetGroupMembershipRequest { + group_id groupList[] = 0; + } + + request struct RemoveGroupRequest { + group_id groupID = 0; + } + + request struct AddGroupIfIdentifyingRequest { + group_id groupID = 0; + CHAR_STRING groupName = 1; + } + + response struct AddGroupResponse = 0 { + ENUM8 status = 0; + group_id groupID = 1; + } + + response struct ViewGroupResponse = 1 { + ENUM8 status = 0; + group_id groupID = 1; + CHAR_STRING groupName = 2; + } + + response struct GetGroupMembershipResponse = 2 { + nullable INT8U capacity = 0; + group_id groupList[] = 1; + } + + response struct RemoveGroupResponse = 3 { + ENUM8 status = 0; + group_id groupID = 1; + } + + fabric command access(invoke: manage) AddGroup(AddGroupRequest): AddGroupResponse = 0; + fabric command ViewGroup(ViewGroupRequest): ViewGroupResponse = 1; + fabric command GetGroupMembership(GetGroupMembershipRequest): GetGroupMembershipResponse = 2; + fabric command access(invoke: manage) RemoveGroup(RemoveGroupRequest): RemoveGroupResponse = 3; + fabric command access(invoke: manage) RemoveAllGroups(): DefaultSuccess = 4; + fabric command access(invoke: manage) AddGroupIfIdentifying(AddGroupIfIdentifyingRequest): DefaultSuccess = 5; +} + +/** Attributes and commands for scene configuration and manipulation. */ +server cluster Scenes = 5 { + bitmap ScenesCopyMode : BITMAP8 { + kCopyAllScenes = 0x1; + } + + bitmap ScenesFeature : BITMAP32 { + kSceneNames = 0x1; + } + + struct ExtensionFieldSet { + cluster_id clusterID = 0; + AttributeValuePair attributeValueList[] = 1; + } + + struct AttributeValuePair { + optional attrib_id attributeID = 0; + int8u attributeValue[] = 1; + } + + readonly attribute int8u sceneCount = 0; + readonly attribute int8u currentScene = 1; + readonly attribute group_id currentGroup = 2; + readonly attribute boolean sceneValid = 3; + readonly attribute bitmap8 nameSupport = 4; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct AddSceneRequest { + group_id groupID = 0; + INT8U sceneID = 1; + INT16U transitionTime = 2; + CHAR_STRING sceneName = 3; + ExtensionFieldSet extensionFieldSets[] = 4; + } + + request struct ViewSceneRequest { + group_id groupID = 0; + INT8U sceneID = 1; + } + + request struct RemoveSceneRequest { + group_id groupID = 0; + INT8U sceneID = 1; + } + + request struct RemoveAllScenesRequest { + group_id groupID = 0; + } + + request struct StoreSceneRequest { + group_id groupID = 0; + INT8U sceneID = 1; + } + + request struct RecallSceneRequest { + group_id groupID = 0; + INT8U sceneID = 1; + optional nullable INT16U transitionTime = 2; + } + + request struct GetSceneMembershipRequest { + group_id groupID = 0; + } + + response struct AddSceneResponse = 0 { + ENUM8 status = 0; + group_id groupID = 1; + INT8U sceneID = 2; + } + + response struct ViewSceneResponse = 1 { + ENUM8 status = 0; + group_id groupID = 1; + INT8U sceneID = 2; + optional INT16U transitionTime = 3; + optional CHAR_STRING sceneName = 4; + optional ExtensionFieldSet extensionFieldSets[] = 5; + } + + response struct RemoveSceneResponse = 2 { + ENUM8 status = 0; + group_id groupID = 1; + INT8U sceneID = 2; + } + + response struct RemoveAllScenesResponse = 3 { + ENUM8 status = 0; + group_id groupID = 1; + } + + response struct StoreSceneResponse = 4 { + ENUM8 status = 0; + group_id groupID = 1; + INT8U sceneID = 2; + } + + response struct GetSceneMembershipResponse = 6 { + ENUM8 status = 0; + nullable INT8U capacity = 1; + group_id groupID = 2; + optional INT8U sceneList[] = 3; + } + + fabric command access(invoke: manage) AddScene(AddSceneRequest): AddSceneResponse = 0; + fabric command ViewScene(ViewSceneRequest): ViewSceneResponse = 1; + fabric command access(invoke: manage) RemoveScene(RemoveSceneRequest): RemoveSceneResponse = 2; + fabric command access(invoke: manage) RemoveAllScenes(RemoveAllScenesRequest): RemoveAllScenesResponse = 3; + fabric command access(invoke: manage) StoreScene(StoreSceneRequest): StoreSceneResponse = 4; + fabric command RecallScene(RecallSceneRequest): DefaultSuccess = 5; + fabric command GetSceneMembership(GetSceneMembershipRequest): GetSceneMembershipResponse = 6; +} + +/** Attributes and commands for switching devices between 'On' and 'Off' states. */ +server cluster OnOff = 6 { + enum OnOffDelayedAllOffEffectVariant : ENUM8 { + kFadeToOffIn0p8Seconds = 0; + kNoFade = 1; + k50PercentDimDownIn0p8SecondsThenFadeToOffIn12Seconds = 2; + } + + enum OnOffDyingLightEffectVariant : ENUM8 { + k20PercenterDimUpIn0p5SecondsThenFadeToOffIn1Second = 0; + } + + enum OnOffEffectIdentifier : ENUM8 { + kDelayedAllOff = 0; + kDyingLight = 1; + } + + enum OnOffStartUpOnOff : ENUM8 { + kOff = 0; + kOn = 1; + kTogglePreviousOnOff = 2; + } + + bitmap OnOffControl : BITMAP8 { + kAcceptOnlyWhenOn = 0x1; + } + + bitmap OnOffFeature : BITMAP32 { + kLighting = 0x1; + } + + readonly nosubscribe attribute boolean onOff = 0; + readonly attribute boolean globalSceneControl = 16384; + attribute int16u onTime = 16385; + attribute int16u offWaitTime = 16386; + attribute access(write: manage) nullable OnOffStartUpOnOff startUpOnOff = 16387; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct OffWithEffectRequest { + OnOffEffectIdentifier effectIdentifier = 0; + int8u effectVariant = 1; + } + + request struct OnWithTimedOffRequest { + OnOffControl onOffControl = 0; + int16u onTime = 1; + int16u offWaitTime = 2; + } + + command Off(): DefaultSuccess = 0; + command On(): DefaultSuccess = 1; + command Toggle(): DefaultSuccess = 2; + command OffWithEffect(OffWithEffectRequest): DefaultSuccess = 64; + command OnWithRecallGlobalScene(): DefaultSuccess = 65; + command OnWithTimedOff(OnWithTimedOffRequest): DefaultSuccess = 66; +} + +/** The Descriptor Cluster is meant to replace the support from the Zigbee Device Object (ZDO) for describing a node, its endpoints and clusters. */ +server cluster Descriptor = 29 { + struct DeviceTypeStruct { + devtype_id deviceType = 0; + int16u revision = 1; + } + + readonly attribute DeviceTypeStruct deviceTypeList[] = 0; + readonly attribute CLUSTER_ID serverList[] = 1; + readonly attribute CLUSTER_ID clientList[] = 2; + readonly attribute ENDPOINT_NO partsList[] = 3; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +/** The Binding Cluster is meant to replace the support from the Zigbee Device Object (ZDO) for supporting the binding table. */ +client cluster Binding = 30 { + fabric_scoped struct TargetStruct { + optional node_id node = 1; + optional group_id group = 2; + optional endpoint_no endpoint = 3; + optional cluster_id cluster = 4; + fabric_idx fabricIndex = 254; + } + + attribute TargetStruct binding[] = 0; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +/** The Binding Cluster is meant to replace the support from the Zigbee Device Object (ZDO) for supporting the binding table. */ +server cluster Binding = 30 { + fabric_scoped struct TargetStruct { + optional node_id node = 1; + optional group_id group = 2; + optional endpoint_no endpoint = 3; + optional cluster_id cluster = 4; + fabric_idx fabricIndex = 254; + } + + attribute TargetStruct binding[] = 0; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +/** The Access Control Cluster exposes a data model view of a + Node's Access Control List (ACL), which codifies the rules used to manage + and enforce Access Control for the Node's endpoints and their associated + cluster instances. */ +server cluster AccessControl = 31 { + enum AccessControlEntryAuthModeEnum : ENUM8 { + kPase = 1; + kCase = 2; + kGroup = 3; + } + + enum AccessControlEntryPrivilegeEnum : ENUM8 { + kView = 1; + kProxyView = 2; + kOperate = 3; + kManage = 4; + kAdminister = 5; + } + + enum ChangeTypeEnum : ENUM8 { + kChanged = 0; + kAdded = 1; + kRemoved = 2; + } + + fabric_scoped struct AccessControlEntryStruct { + fabric_sensitive AccessControlEntryPrivilegeEnum privilege = 1; + fabric_sensitive AccessControlEntryAuthModeEnum authMode = 2; + nullable fabric_sensitive int64u subjects[] = 3; + nullable fabric_sensitive Target targets[] = 4; + fabric_idx fabricIndex = 254; + } + + struct Target { + nullable cluster_id cluster = 0; + nullable endpoint_no endpoint = 1; + nullable devtype_id deviceType = 2; + } + + fabric_scoped struct AccessControlExtensionStruct { + fabric_sensitive octet_string<128> data = 1; + fabric_idx fabricIndex = 254; + } + + fabric_sensitive info event access(read: administer) AccessControlEntryChanged = 0 { + nullable node_id adminNodeID = 1; + nullable INT16U adminPasscodeID = 2; + ChangeTypeEnum changeType = 3; + nullable AccessControlEntryStruct latestValue = 4; + fabric_idx fabricIndex = 254; + } + + fabric_sensitive info event access(read: administer) AccessControlExtensionChanged = 1 { + nullable node_id adminNodeID = 1; + nullable INT16U adminPasscodeID = 2; + ChangeTypeEnum changeType = 3; + nullable AccessControlExtensionStruct latestValue = 4; + fabric_idx fabricIndex = 254; + } + + attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0; + attribute access(read: administer, write: administer) AccessControlExtensionStruct extension[] = 1; + readonly attribute int16u subjectsPerAccessControlEntry = 2; + readonly attribute int16u targetsPerAccessControlEntry = 3; + readonly attribute int16u accessControlEntriesPerFabric = 4; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +/** This cluster provides attributes and events for determining basic information about Nodes, which supports both + Commissioning and operational determination of Node characteristics, such as Vendor ID, Product ID and serial number, + which apply to the whole Node. Also allows setting user device information such as location. */ +server cluster BasicInformation = 40 { + struct CapabilityMinimaStruct { + int16u caseSessionsPerFabric = 0; + int16u subscriptionsPerFabric = 1; + } + + critical event StartUp = 0 { + INT32U softwareVersion = 0; + } + + critical event ShutDown = 1 { + } + + info event Leave = 2 { + fabric_idx fabricIndex = 0; + } + + info event ReachableChanged = 3 { + boolean reachableNewValue = 0; + } + + readonly attribute int16u dataModelRevision = 0; + readonly attribute char_string<32> vendorName = 1; + readonly attribute vendor_id vendorID = 2; + readonly attribute char_string<32> productName = 3; + readonly attribute int16u productID = 4; + attribute access(write: manage) char_string<32> nodeLabel = 5; + attribute access(write: administer) char_string<2> location = 6; + readonly attribute int16u hardwareVersion = 7; + readonly attribute char_string<64> hardwareVersionString = 8; + readonly attribute int32u softwareVersion = 9; + readonly attribute char_string<64> softwareVersionString = 10; + readonly attribute char_string<16> manufacturingDate = 11; + readonly attribute char_string<32> partNumber = 12; + readonly attribute long_char_string<256> productURL = 13; + readonly attribute char_string<64> productLabel = 14; + readonly attribute char_string<32> serialNumber = 15; + attribute access(write: manage) boolean localConfigDisabled = 16; + readonly attribute boolean reachable = 17; + readonly attribute char_string<32> uniqueID = 18; + readonly attribute CapabilityMinimaStruct capabilityMinima = 19; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +/** Provides an interface for providing OTA software updates */ +server cluster OtaSoftwareUpdateProvider = 41 { + enum OTAApplyUpdateAction : ENUM8 { + kProceed = 0; + kAwaitNextAction = 1; + kDiscontinue = 2; + } + + enum OTADownloadProtocol : ENUM8 { + kBDXSynchronous = 0; + kBDXAsynchronous = 1; + kHttps = 2; + kVendorSpecific = 3; + } + + enum OTAQueryStatus : ENUM8 { + kUpdateAvailable = 0; + kBusy = 1; + kNotAvailable = 2; + kDownloadProtocolNotSupported = 3; + } + + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct QueryImageRequest { + vendor_id vendorID = 0; + INT16U productID = 1; + INT32U softwareVersion = 2; + OTADownloadProtocol protocolsSupported[] = 3; + optional INT16U hardwareVersion = 4; + optional CHAR_STRING<2> location = 5; + optional BOOLEAN requestorCanConsent = 6; + optional OCTET_STRING<512> metadataForProvider = 7; + } + + request struct ApplyUpdateRequestRequest { + OCTET_STRING<32> updateToken = 0; + INT32U newVersion = 1; + } + + request struct NotifyUpdateAppliedRequest { + OCTET_STRING<32> updateToken = 0; + INT32U softwareVersion = 1; + } + + response struct QueryImageResponse = 1 { + OTAQueryStatus status = 0; + optional INT32U delayedActionTime = 1; + optional CHAR_STRING<256> imageURI = 2; + optional INT32U softwareVersion = 3; + optional CHAR_STRING<64> softwareVersionString = 4; + optional OCTET_STRING<32> updateToken = 5; + optional BOOLEAN userConsentNeeded = 6; + optional OCTET_STRING<512> metadataForRequestor = 7; + } + + response struct ApplyUpdateResponse = 3 { + OTAApplyUpdateAction action = 0; + INT32U delayedActionTime = 1; + } + + command QueryImage(QueryImageRequest): QueryImageResponse = 0; + command ApplyUpdateRequest(ApplyUpdateRequestRequest): ApplyUpdateResponse = 2; + command NotifyUpdateApplied(NotifyUpdateAppliedRequest): DefaultSuccess = 4; +} + +/** Nodes should be expected to be deployed to any and all regions of the world. These global regions + may have differing common languages, units of measurements, and numerical formatting + standards. As such, Nodes that visually or audibly convey information need a mechanism by which + they can be configured to use a user’s preferred language, units, etc */ +server cluster LocalizationConfiguration = 43 { + attribute char_string<35> activeLocale = 0; + readonly attribute CHAR_STRING supportedLocales[] = 1; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +/** Nodes should be expected to be deployed to any and all regions of the world. These global regions + may have differing preferences for how dates and times are conveyed. As such, Nodes that visually + or audibly convey time information need a mechanism by which they can be configured to use a + user’s preferred format. */ +server cluster TimeFormatLocalization = 44 { + enum CalendarTypeEnum : ENUM8 { + kBuddhist = 0; + kChinese = 1; + kCoptic = 2; + kEthiopian = 3; + kGregorian = 4; + kHebrew = 5; + kIndian = 6; + kIslamic = 7; + kJapanese = 8; + kKorean = 9; + kPersian = 10; + kTaiwanese = 11; + } + + enum HourFormatEnum : ENUM8 { + k12hr = 0; + k24hr = 1; + } + + attribute HourFormatEnum hourFormat = 0; + attribute CalendarTypeEnum activeCalendarType = 1; + readonly attribute CalendarTypeEnum supportedCalendarTypes[] = 2; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +/** Nodes should be expected to be deployed to any and all regions of the world. These global regions + may have differing preferences for the units in which values are conveyed in communication to a + user. As such, Nodes that visually or audibly convey measurable values to the user need a + mechanism by which they can be configured to use a user’s preferred unit. */ +server cluster UnitLocalization = 45 { + enum TempUnitEnum : ENUM8 { + kFahrenheit = 0; + kCelsius = 1; + kKelvin = 2; + } + + bitmap UnitLocalizationFeature : BITMAP32 { + kTemperatureUnit = 0x1; + } + + attribute TempUnitEnum temperatureUnit = 0; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +/** This cluster is used to manage global aspects of the Commissioning flow. */ +client cluster GeneralCommissioning = 48 { + enum CommissioningError : ENUM8 { + kOk = 0; + kValueOutsideRange = 1; + kInvalidAuthentication = 2; + kNoFailSafe = 3; + kBusyWithOtherAdmin = 4; + } + + enum RegulatoryLocationType : ENUM8 { + kIndoor = 0; + kOutdoor = 1; + kIndoorOutdoor = 2; + } + + struct BasicCommissioningInfo { + int16u failSafeExpiryLengthSeconds = 0; + int16u maxCumulativeFailsafeSeconds = 1; + } + + attribute access(write: administer) int64u breadcrumb = 0; + readonly attribute BasicCommissioningInfo basicCommissioningInfo = 1; + readonly attribute RegulatoryLocationType regulatoryConfig = 2; + readonly attribute RegulatoryLocationType locationCapability = 3; + readonly attribute boolean supportsConcurrentConnection = 4; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct ArmFailSafeRequest { + INT16U expiryLengthSeconds = 0; + INT64U breadcrumb = 1; + } + + response struct ArmFailSafeResponse = 1 { + CommissioningError errorCode = 0; + CHAR_STRING debugText = 1; + } + + request struct SetRegulatoryConfigRequest { + RegulatoryLocationType newRegulatoryConfig = 0; + CHAR_STRING countryCode = 1; + INT64U breadcrumb = 2; + } + + response struct SetRegulatoryConfigResponse = 3 { + CommissioningError errorCode = 0; + CHAR_STRING debugText = 1; + } + + response struct CommissioningCompleteResponse = 5 { + CommissioningError errorCode = 0; + CHAR_STRING debugText = 1; + } + + /** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */ + command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0; + /** Set the regulatory configuration to be used during commissioning */ + command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2; + /** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */ + fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4; +} + +/** This cluster is used to manage global aspects of the Commissioning flow. */ +server cluster GeneralCommissioning = 48 { + enum CommissioningError : ENUM8 { + kOk = 0; + kValueOutsideRange = 1; + kInvalidAuthentication = 2; + kNoFailSafe = 3; + kBusyWithOtherAdmin = 4; + } + + enum RegulatoryLocationType : ENUM8 { + kIndoor = 0; + kOutdoor = 1; + kIndoorOutdoor = 2; + } + + struct BasicCommissioningInfo { + int16u failSafeExpiryLengthSeconds = 0; + int16u maxCumulativeFailsafeSeconds = 1; + } + + attribute access(write: administer) int64u breadcrumb = 0; + readonly attribute BasicCommissioningInfo basicCommissioningInfo = 1; + readonly attribute RegulatoryLocationType regulatoryConfig = 2; + readonly attribute RegulatoryLocationType locationCapability = 3; + readonly attribute boolean supportsConcurrentConnection = 4; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct ArmFailSafeRequest { + INT16U expiryLengthSeconds = 0; + INT64U breadcrumb = 1; + } + + request struct SetRegulatoryConfigRequest { + RegulatoryLocationType newRegulatoryConfig = 0; + CHAR_STRING countryCode = 1; + INT64U breadcrumb = 2; + } + + response struct ArmFailSafeResponse = 1 { + CommissioningError errorCode = 0; + CHAR_STRING debugText = 1; + } + + response struct SetRegulatoryConfigResponse = 3 { + CommissioningError errorCode = 0; + CHAR_STRING debugText = 1; + } + + response struct CommissioningCompleteResponse = 5 { + CommissioningError errorCode = 0; + CHAR_STRING debugText = 1; + } + + command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0; + command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2; + fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4; +} + +/** Functionality to configure, enable, disable network credentials and access on a Matter device. */ +client cluster NetworkCommissioning = 49 { + enum NetworkCommissioningStatus : ENUM8 { + kSuccess = 0; + kOutOfRange = 1; + kBoundsExceeded = 2; + kNetworkIDNotFound = 3; + kDuplicateNetworkID = 4; + kNetworkNotFound = 5; + kRegulatoryError = 6; + kAuthFailure = 7; + kUnsupportedSecurity = 8; + kOtherConnectionFailure = 9; + kIPV6Failed = 10; + kIPBindFailed = 11; + kUnknownError = 12; + } + + enum WiFiBand : ENUM8 { + k2g4 = 0; + k3g65 = 1; + k5g = 2; + k6g = 3; + k60g = 4; + } + + bitmap NetworkCommissioningFeature : BITMAP32 { + kWiFiNetworkInterface = 0x1; + kThreadNetworkInterface = 0x2; + kEthernetNetworkInterface = 0x4; + } + + bitmap WiFiSecurity : BITMAP8 { + kUnencrypted = 0x1; + kWep = 0x2; + kWpaPersonal = 0x4; + kWpa2Personal = 0x8; + kWpa3Personal = 0x10; + } + + struct NetworkInfo { + octet_string<32> networkID = 0; + boolean connected = 1; + } + + struct ThreadInterfaceScanResult { + int16u panId = 0; + int64u extendedPanId = 1; + char_string<16> networkName = 2; + int16u channel = 3; + int8u version = 4; + octet_string<8> extendedAddress = 5; + int8s rssi = 6; + int8u lqi = 7; + } + + struct WiFiInterfaceScanResult { + WiFiSecurity security = 0; + octet_string<32> ssid = 1; + octet_string<6> bssid = 2; + int16u channel = 3; + WiFiBand wiFiBand = 4; + int8s rssi = 5; + } + + readonly attribute access(read: administer) int8u maxNetworks = 0; + readonly attribute access(read: administer) NetworkInfo networks[] = 1; + readonly attribute optional int8u scanMaxTimeSeconds = 2; + readonly attribute optional int8u connectMaxTimeSeconds = 3; + attribute access(write: administer) boolean interfaceEnabled = 4; + readonly attribute access(read: administer) nullable NetworkCommissioningStatus lastNetworkingStatus = 5; + readonly attribute access(read: administer) nullable octet_string<32> lastNetworkID = 6; + readonly attribute access(read: administer) nullable int32s lastConnectErrorValue = 7; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct ScanNetworksRequest { + optional nullable OCTET_STRING<32> ssid = 0; + optional INT64U breadcrumb = 1; + } + + response struct ScanNetworksResponse = 1 { + NetworkCommissioningStatus networkingStatus = 0; + optional CHAR_STRING debugText = 1; + optional WiFiInterfaceScanResult wiFiScanResults[] = 2; + optional ThreadInterfaceScanResult threadScanResults[] = 3; + } + + request struct AddOrUpdateWiFiNetworkRequest { + OCTET_STRING<32> ssid = 0; + OCTET_STRING<64> credentials = 1; + optional INT64U breadcrumb = 2; + } + + request struct AddOrUpdateThreadNetworkRequest { + OCTET_STRING<254> operationalDataset = 0; + optional INT64U breadcrumb = 1; + } + + request struct RemoveNetworkRequest { + OCTET_STRING<32> networkID = 0; + optional INT64U breadcrumb = 1; + } + + response struct NetworkConfigResponse = 5 { + NetworkCommissioningStatus networkingStatus = 0; + optional CHAR_STRING<512> debugText = 1; + optional INT8U networkIndex = 2; + } + + request struct ConnectNetworkRequest { + OCTET_STRING<32> networkID = 0; + optional INT64U breadcrumb = 1; + } + + response struct ConnectNetworkResponse = 7 { + NetworkCommissioningStatus networkingStatus = 0; + optional CHAR_STRING debugText = 1; + nullable INT32S errorValue = 2; + } + + request struct ReorderNetworkRequest { + OCTET_STRING<32> networkID = 0; + INT8U networkIndex = 1; + optional INT64U breadcrumb = 2; + } + + /** Detemine the set of networks the device sees as available. */ + command access(invoke: administer) ScanNetworks(ScanNetworksRequest): ScanNetworksResponse = 0; + /** Add or update the credentials for a given Wi-Fi network. */ + command access(invoke: administer) AddOrUpdateWiFiNetwork(AddOrUpdateWiFiNetworkRequest): NetworkConfigResponse = 2; + /** Add or update the credentials for a given Thread network. */ + command access(invoke: administer) AddOrUpdateThreadNetwork(AddOrUpdateThreadNetworkRequest): NetworkConfigResponse = 3; + /** Remove the definition of a given network (including its credentials). */ + command access(invoke: administer) RemoveNetwork(RemoveNetworkRequest): NetworkConfigResponse = 4; + /** Connect to the specified network, using previously-defined credentials. */ + command access(invoke: administer) ConnectNetwork(ConnectNetworkRequest): ConnectNetworkResponse = 6; + /** Modify the order in which networks will be presented in the Networks attribute. */ + command access(invoke: administer) ReorderNetwork(ReorderNetworkRequest): NetworkConfigResponse = 8; +} + +/** Functionality to configure, enable, disable network credentials and access on a Matter device. */ +server cluster NetworkCommissioning = 49 { + enum NetworkCommissioningStatus : ENUM8 { + kSuccess = 0; + kOutOfRange = 1; + kBoundsExceeded = 2; + kNetworkIDNotFound = 3; + kDuplicateNetworkID = 4; + kNetworkNotFound = 5; + kRegulatoryError = 6; + kAuthFailure = 7; + kUnsupportedSecurity = 8; + kOtherConnectionFailure = 9; + kIPV6Failed = 10; + kIPBindFailed = 11; + kUnknownError = 12; + } + + enum WiFiBand : ENUM8 { + k2g4 = 0; + k3g65 = 1; + k5g = 2; + k6g = 3; + k60g = 4; + } + + bitmap NetworkCommissioningFeature : BITMAP32 { + kWiFiNetworkInterface = 0x1; + kThreadNetworkInterface = 0x2; + kEthernetNetworkInterface = 0x4; + } + + bitmap WiFiSecurity : BITMAP8 { + kUnencrypted = 0x1; + kWep = 0x2; + kWpaPersonal = 0x4; + kWpa2Personal = 0x8; + kWpa3Personal = 0x10; + } + + struct NetworkInfo { + octet_string<32> networkID = 0; + boolean connected = 1; + } + + struct WiFiInterfaceScanResult { + WiFiSecurity security = 0; + octet_string<32> ssid = 1; + octet_string<6> bssid = 2; + int16u channel = 3; + WiFiBand wiFiBand = 4; + int8s rssi = 5; + } + + struct ThreadInterfaceScanResult { + int16u panId = 0; + int64u extendedPanId = 1; + char_string<16> networkName = 2; + int16u channel = 3; + int8u version = 4; + octet_string<8> extendedAddress = 5; + int8s rssi = 6; + int8u lqi = 7; + } + + readonly attribute access(read: administer) int8u maxNetworks = 0; + readonly attribute access(read: administer) NetworkInfo networks[] = 1; + readonly attribute int8u scanMaxTimeSeconds = 2; + readonly attribute int8u connectMaxTimeSeconds = 3; + attribute access(write: administer) boolean interfaceEnabled = 4; + readonly attribute access(read: administer) nullable NetworkCommissioningStatus lastNetworkingStatus = 5; + readonly attribute access(read: administer) nullable octet_string<32> lastNetworkID = 6; + readonly attribute access(read: administer) nullable int32s lastConnectErrorValue = 7; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct ScanNetworksRequest { + optional nullable OCTET_STRING<32> ssid = 0; + optional INT64U breadcrumb = 1; + } + + request struct AddOrUpdateWiFiNetworkRequest { + OCTET_STRING<32> ssid = 0; + OCTET_STRING<64> credentials = 1; + optional INT64U breadcrumb = 2; + } + + request struct AddOrUpdateThreadNetworkRequest { + OCTET_STRING<254> operationalDataset = 0; + optional INT64U breadcrumb = 1; + } + + request struct RemoveNetworkRequest { + OCTET_STRING<32> networkID = 0; + optional INT64U breadcrumb = 1; + } + + request struct ConnectNetworkRequest { + OCTET_STRING<32> networkID = 0; + optional INT64U breadcrumb = 1; + } + + request struct ReorderNetworkRequest { + OCTET_STRING<32> networkID = 0; + INT8U networkIndex = 1; + optional INT64U breadcrumb = 2; + } + + response struct ScanNetworksResponse = 1 { + NetworkCommissioningStatus networkingStatus = 0; + optional CHAR_STRING debugText = 1; + optional WiFiInterfaceScanResult wiFiScanResults[] = 2; + optional ThreadInterfaceScanResult threadScanResults[] = 3; + } + + response struct NetworkConfigResponse = 5 { + NetworkCommissioningStatus networkingStatus = 0; + optional CHAR_STRING<512> debugText = 1; + optional INT8U networkIndex = 2; + } + + response struct ConnectNetworkResponse = 7 { + NetworkCommissioningStatus networkingStatus = 0; + optional CHAR_STRING debugText = 1; + nullable INT32S errorValue = 2; + } + + command access(invoke: administer) ScanNetworks(ScanNetworksRequest): ScanNetworksResponse = 0; + command access(invoke: administer) AddOrUpdateWiFiNetwork(AddOrUpdateWiFiNetworkRequest): NetworkConfigResponse = 2; + command access(invoke: administer) AddOrUpdateThreadNetwork(AddOrUpdateThreadNetworkRequest): NetworkConfigResponse = 3; + command access(invoke: administer) RemoveNetwork(RemoveNetworkRequest): NetworkConfigResponse = 4; + command access(invoke: administer) ConnectNetwork(ConnectNetworkRequest): ConnectNetworkResponse = 6; + command access(invoke: administer) ReorderNetwork(ReorderNetworkRequest): NetworkConfigResponse = 8; +} + +/** The cluster provides commands for retrieving unstructured diagnostic logs from a Node that may be used to aid in diagnostics. */ +server cluster DiagnosticLogs = 50 { + enum IntentEnum : ENUM8 { + kEndUserSupport = 0; + kNetworkDiag = 1; + kCrashLogs = 2; + } + + enum StatusEnum : ENUM8 { + kSuccess = 0; + kExhausted = 1; + kNoLogs = 2; + kBusy = 3; + kDenied = 4; + } + + enum TransferProtocolEnum : ENUM8 { + kResponsePayload = 0; + kBdx = 1; + } + + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct RetrieveLogsRequestRequest { + IntentEnum intent = 0; + TransferProtocolEnum requestedProtocol = 1; + optional CHAR_STRING<32> transferFileDesignator = 2; + } + + command RetrieveLogsRequest(RetrieveLogsRequestRequest): RetrieveLogsResponse = 0; +} + +/** The General Diagnostics Cluster, along with other diagnostics clusters, provide a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */ +server cluster GeneralDiagnostics = 51 { + enum BootReasonEnum : ENUM8 { + kUnspecified = 0; + kPowerOnReboot = 1; + kBrownOutReset = 2; + kSoftwareWatchdogReset = 3; + kHardwareWatchdogReset = 4; + kSoftwareUpdateCompleted = 5; + kSoftwareReset = 6; + } + + enum HardwareFaultEnum : ENUM8 { + kUnspecified = 0; + kRadio = 1; + kSensor = 2; + kResettableOverTemp = 3; + kNonResettableOverTemp = 4; + kPowerSource = 5; + kVisualDisplayFault = 6; + kAudioOutputFault = 7; + kUserInterfaceFault = 8; + kNonVolatileMemoryError = 9; + kTamperDetected = 10; + } + + enum InterfaceTypeEnum : ENUM8 { + kUnspecified = 0; + kWiFi = 1; + kEthernet = 2; + kCellular = 3; + kThread = 4; + } + + enum NetworkFaultEnum : ENUM8 { + kUnspecified = 0; + kHardwareFailure = 1; + kNetworkJammed = 2; + kConnectionFailed = 3; + } + + enum RadioFaultEnum : ENUM8 { + kUnspecified = 0; + kWiFiFault = 1; + kCellularFault = 2; + kThreadFault = 3; + kNFCFault = 4; + kBLEFault = 5; + kEthernetFault = 6; + } + + struct NetworkInterface { + char_string<32> name = 0; + boolean isOperational = 1; + nullable boolean offPremiseServicesReachableIPv4 = 2; + nullable boolean offPremiseServicesReachableIPv6 = 3; + octet_string<8> hardwareAddress = 4; + octet_string IPv4Addresses[] = 5; + octet_string IPv6Addresses[] = 6; + InterfaceTypeEnum type = 7; + } + + critical event HardwareFaultChange = 0 { + HardwareFaultEnum current[] = 0; + HardwareFaultEnum previous[] = 1; + } + + critical event RadioFaultChange = 1 { + RadioFaultEnum current[] = 0; + RadioFaultEnum previous[] = 1; + } + + critical event NetworkFaultChange = 2 { + NetworkFaultEnum current[] = 0; + NetworkFaultEnum previous[] = 1; + } + + critical event BootReason = 3 { + BootReasonEnum bootReason = 0; + } + + readonly attribute NetworkInterface networkInterfaces[] = 0; + readonly attribute int16u rebootCount = 1; + readonly attribute int64u upTime = 2; + readonly attribute int32u totalOperationalHours = 3; + readonly attribute BootReasonEnum bootReason = 4; + readonly attribute HardwareFaultEnum activeHardwareFaults[] = 5; + readonly attribute RadioFaultEnum activeRadioFaults[] = 6; + readonly attribute NetworkFaultEnum activeNetworkFaults[] = 7; + readonly attribute boolean testEventTriggersEnabled = 8; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct TestEventTriggerRequest { + OCTET_STRING<16> enableKey = 0; + INT64U eventTrigger = 1; + } + + command access(invoke: manage) TestEventTrigger(TestEventTriggerRequest): DefaultSuccess = 0; +} + +/** The Software Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */ +server cluster SoftwareDiagnostics = 52 { + bitmap SoftwareDiagnosticsFeature : BITMAP32 { + kWaterMarks = 0x1; + } + + struct ThreadMetricsStruct { + int64u id = 0; + optional char_string<8> name = 1; + optional int32u stackFreeCurrent = 2; + optional int32u stackFreeMinimum = 3; + optional int32u stackSize = 4; + } + + info event SoftwareFault = 0 { + INT64U id = 0; + optional CHAR_STRING name = 1; + optional OCTET_STRING faultRecording = 2; + } + + readonly attribute ThreadMetricsStruct threadMetrics[] = 0; + readonly attribute int64u currentHeapFree = 1; + readonly attribute int64u currentHeapUsed = 2; + readonly attribute int64u currentHeapHighWatermark = 3; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +/** The Thread Network Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems */ +server cluster ThreadNetworkDiagnostics = 53 { + enum ConnectionStatusEnum : ENUM8 { + kConnected = 0; + kNotConnected = 1; + } + + enum NetworkFault : ENUM8 { + kUnspecified = 0; + kLinkDown = 1; + kHardwareFailure = 2; + kNetworkJammed = 3; + } + + enum RoutingRole : ENUM8 { + kUnspecified = 0; + kUnassigned = 1; + kSleepyEndDevice = 2; + kEndDevice = 3; + kReed = 4; + kRouter = 5; + kLeader = 6; + } + + bitmap ThreadNetworkDiagnosticsFeature : BITMAP32 { + kPacketCounts = 0x1; + kErrorCounts = 0x2; + kMLECounts = 0x4; + kMACCounts = 0x8; + } + + struct NeighborTable { + int64u extAddress = 0; + int32u age = 1; + int16u rloc16 = 2; + int32u linkFrameCounter = 3; + int32u mleFrameCounter = 4; + int8u lqi = 5; + nullable int8s averageRssi = 6; + nullable int8s lastRssi = 7; + int8u frameErrorRate = 8; + int8u messageErrorRate = 9; + boolean rxOnWhenIdle = 10; + boolean fullThreadDevice = 11; + boolean fullNetworkData = 12; + boolean isChild = 13; + } + + struct RouteTable { + int64u extAddress = 0; + int16u rloc16 = 1; + int8u routerId = 2; + int8u nextHop = 3; + int8u pathCost = 4; + int8u LQIIn = 5; + int8u LQIOut = 6; + int8u age = 7; + boolean allocated = 8; + boolean linkEstablished = 9; + } + + struct SecurityPolicy { + int16u rotationTime = 0; + int16u flags = 1; + } + + struct OperationalDatasetComponents { + boolean activeTimestampPresent = 0; + boolean pendingTimestampPresent = 1; + boolean masterKeyPresent = 2; + boolean networkNamePresent = 3; + boolean extendedPanIdPresent = 4; + boolean meshLocalPrefixPresent = 5; + boolean delayPresent = 6; + boolean panIdPresent = 7; + boolean channelPresent = 8; + boolean pskcPresent = 9; + boolean securityPolicyPresent = 10; + boolean channelMaskPresent = 11; + } + + info event ConnectionStatus = 0 { + ConnectionStatusEnum connectionStatus = 0; + } + + info event NetworkFaultChange = 1 { + NetworkFault current[] = 0; + NetworkFault previous[] = 1; + } + + readonly attribute nullable int16u channel = 0; + readonly attribute nullable RoutingRole routingRole = 1; + readonly attribute nullable char_string<16> networkName = 2; + readonly attribute nullable int16u panId = 3; + readonly attribute nullable int64u extendedPanId = 4; + readonly attribute nullable octet_string<17> meshLocalPrefix = 5; + readonly attribute int64u overrunCount = 6; + readonly attribute NeighborTable neighborTable[] = 7; + readonly attribute RouteTable routeTable[] = 8; + readonly attribute nullable int32u partitionId = 9; + readonly attribute nullable int8u weighting = 10; + readonly attribute nullable int8u dataVersion = 11; + readonly attribute nullable int8u stableDataVersion = 12; + readonly attribute nullable int8u leaderRouterId = 13; + readonly attribute int16u detachedRoleCount = 14; + readonly attribute int16u childRoleCount = 15; + readonly attribute int16u routerRoleCount = 16; + readonly attribute int16u leaderRoleCount = 17; + readonly attribute int16u attachAttemptCount = 18; + readonly attribute int16u partitionIdChangeCount = 19; + readonly attribute int16u betterPartitionAttachAttemptCount = 20; + readonly attribute int16u parentChangeCount = 21; + readonly attribute int32u txTotalCount = 22; + readonly attribute int32u txUnicastCount = 23; + readonly attribute int32u txBroadcastCount = 24; + readonly attribute int32u txAckRequestedCount = 25; + readonly attribute int32u txAckedCount = 26; + readonly attribute int32u txNoAckRequestedCount = 27; + readonly attribute int32u txDataCount = 28; + readonly attribute int32u txDataPollCount = 29; + readonly attribute int32u txBeaconCount = 30; + readonly attribute int32u txBeaconRequestCount = 31; + readonly attribute int32u txOtherCount = 32; + readonly attribute int32u txRetryCount = 33; + readonly attribute int32u txDirectMaxRetryExpiryCount = 34; + readonly attribute int32u txIndirectMaxRetryExpiryCount = 35; + readonly attribute int32u txErrCcaCount = 36; + readonly attribute int32u txErrAbortCount = 37; + readonly attribute int32u txErrBusyChannelCount = 38; + readonly attribute int32u rxTotalCount = 39; + readonly attribute int32u rxUnicastCount = 40; + readonly attribute int32u rxBroadcastCount = 41; + readonly attribute int32u rxDataCount = 42; + readonly attribute int32u rxDataPollCount = 43; + readonly attribute int32u rxBeaconCount = 44; + readonly attribute int32u rxBeaconRequestCount = 45; + readonly attribute int32u rxOtherCount = 46; + readonly attribute int32u rxAddressFilteredCount = 47; + readonly attribute int32u rxDestAddrFilteredCount = 48; + readonly attribute int32u rxDuplicatedCount = 49; + readonly attribute int32u rxErrNoFrameCount = 50; + readonly attribute int32u rxErrUnknownNeighborCount = 51; + readonly attribute int32u rxErrInvalidSrcAddrCount = 52; + readonly attribute int32u rxErrSecCount = 53; + readonly attribute int32u rxErrFcsCount = 54; + readonly attribute int32u rxErrOtherCount = 55; + readonly attribute nullable int64u activeTimestamp = 56; + readonly attribute nullable int64u pendingTimestamp = 57; + readonly attribute nullable int32u delay = 58; + readonly attribute nullable SecurityPolicy securityPolicy = 59; + readonly attribute nullable octet_string<4> channelPage0Mask = 60; + readonly attribute nullable OperationalDatasetComponents operationalDatasetComponents = 61; + readonly attribute NetworkFault activeNetworkFaultsList[] = 62; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +/** The Wi-Fi Network Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */ +server cluster WiFiNetworkDiagnostics = 54 { + enum AssociationFailureCauseEnum : ENUM8 { + kUnknown = 0; + kAssociationFailed = 1; + kAuthenticationFailed = 2; + kSsidNotFound = 3; + } + + enum ConnectionStatusEnum : ENUM8 { + kConnected = 0; + kNotConnected = 1; + } + + enum SecurityTypeEnum : ENUM8 { + kUnspecified = 0; + kNone = 1; + kWep = 2; + kWpa = 3; + kWpa2 = 4; + kWpa3 = 5; + } + + enum WiFiVersionEnum : ENUM8 { + kA = 0; + kB = 1; + kG = 2; + kN = 3; + kAc = 4; + kAx = 5; + } + + bitmap WiFiNetworkDiagnosticsFeature : BITMAP32 { + kPacketCounts = 0x1; + kErrorCounts = 0x2; + } + + info event Disconnection = 0 { + INT16U reasonCode = 0; + } + + info event AssociationFailure = 1 { + AssociationFailureCauseEnum associationFailure = 0; + INT16U status = 1; + } + + info event ConnectionStatus = 2 { + ConnectionStatusEnum connectionStatus = 0; + } + + readonly attribute nullable octet_string<6> bssid = 0; + readonly attribute nullable SecurityTypeEnum securityType = 1; + readonly attribute nullable WiFiVersionEnum wiFiVersion = 2; + readonly attribute nullable int16u channelNumber = 3; + readonly attribute nullable int8s rssi = 4; + readonly attribute nullable int32u beaconLostCount = 5; + readonly attribute nullable int32u beaconRxCount = 6; + readonly attribute nullable int32u packetMulticastRxCount = 7; + readonly attribute nullable int32u packetMulticastTxCount = 8; + readonly attribute nullable int32u packetUnicastRxCount = 9; + readonly attribute nullable int32u packetUnicastTxCount = 10; + readonly attribute nullable int64u currentMaxRate = 11; + readonly attribute nullable int64u overrunCount = 12; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +/** The Ethernet Network Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */ +server cluster EthernetNetworkDiagnostics = 55 { + enum PHYRateEnum : ENUM8 { + kRate10M = 0; + kRate100M = 1; + kRate1G = 2; + kRate25g = 3; + kRate5G = 4; + kRate10G = 5; + kRate40G = 6; + kRate100G = 7; + kRate200G = 8; + kRate400G = 9; + } + + bitmap EthernetNetworkDiagnosticsFeature : BITMAP32 { + kPacketCounts = 0x1; + kErrorCounts = 0x2; + } + + readonly attribute nullable PHYRateEnum PHYRate = 0; + readonly attribute nullable boolean fullDuplex = 1; + readonly attribute int64u packetRxCount = 2; + readonly attribute int64u packetTxCount = 3; + readonly attribute int64u txErrCount = 4; + readonly attribute int64u collisionCount = 5; + readonly attribute int64u overrunCount = 6; + readonly attribute nullable boolean carrierDetect = 7; + readonly attribute int64u timeSinceReset = 8; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + command ResetCounts(): DefaultSuccess = 0; +} + +/** Commands to trigger a Node to allow a new Administrator to commission it. */ +server cluster AdministratorCommissioning = 60 { + enum CommissioningWindowStatusEnum : ENUM8 { + kWindowNotOpen = 0; + kEnhancedWindowOpen = 1; + kBasicWindowOpen = 2; + } + + enum StatusCode : ENUM8 { + kBusy = 2; + kPAKEParameterError = 3; + kWindowNotOpen = 4; + } + + readonly attribute CommissioningWindowStatusEnum windowStatus = 0; + readonly attribute nullable fabric_idx adminFabricIndex = 1; + readonly attribute nullable int16u adminVendorId = 2; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct OpenCommissioningWindowRequest { + INT16U commissioningTimeout = 0; + OCTET_STRING PAKEPasscodeVerifier = 1; + INT16U discriminator = 2; + INT32U iterations = 3; + OCTET_STRING salt = 4; + } + + request struct OpenBasicCommissioningWindowRequest { + INT16U commissioningTimeout = 0; + } + + timed command access(invoke: administer) OpenCommissioningWindow(OpenCommissioningWindowRequest): DefaultSuccess = 0; + timed command access(invoke: administer) OpenBasicCommissioningWindow(OpenBasicCommissioningWindowRequest): DefaultSuccess = 1; + timed command access(invoke: administer) RevokeCommissioning(): DefaultSuccess = 2; +} + +/** This cluster is used to add or remove Operational Credentials on a Commissionee or Node, as well as manage the associated Fabrics. */ +client cluster OperationalCredentials = 62 { + enum CertificateChainTypeEnum : ENUM8 { + kDACCertificate = 1; + kPAICertificate = 2; + } + + enum NodeOperationalCertStatusEnum : ENUM8 { + kOk = 0; + kInvalidPublicKey = 1; + kInvalidNodeOpId = 2; + kInvalidNOC = 3; + kMissingCsr = 4; + kTableFull = 5; + kInvalidAdminSubject = 6; + kFabricConflict = 9; + kLabelConflict = 10; + kInvalidFabricIndex = 11; + } + + fabric_scoped struct FabricDescriptorStruct { + octet_string<65> rootPublicKey = 1; + vendor_id vendorID = 2; + fabric_id fabricID = 3; + node_id nodeID = 4; + char_string<32> label = 5; + fabric_idx fabricIndex = 254; + } + + fabric_scoped struct NOCStruct { + fabric_sensitive octet_string noc = 1; + nullable fabric_sensitive octet_string icac = 2; + fabric_idx fabricIndex = 254; + } + + readonly attribute access(read: administer) NOCStruct NOCs[] = 0; + readonly attribute FabricDescriptorStruct fabrics[] = 1; + readonly attribute int8u supportedFabrics = 2; + readonly attribute int8u commissionedFabrics = 3; + readonly attribute OCTET_STRING trustedRootCertificates[] = 4; + readonly attribute int8u currentFabricIndex = 5; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct AttestationRequestRequest { + OCTET_STRING attestationNonce = 0; + } + + response struct AttestationResponse = 1 { + OCTET_STRING attestationElements = 0; + OCTET_STRING attestationSignature = 1; + } + + request struct CertificateChainRequestRequest { + CertificateChainTypeEnum certificateType = 0; + } + + response struct CertificateChainResponse = 3 { + OCTET_STRING certificate = 0; + } + + request struct CSRRequestRequest { + OCTET_STRING CSRNonce = 0; + optional boolean isForUpdateNOC = 1; + } + + response struct CSRResponse = 5 { + OCTET_STRING NOCSRElements = 0; + OCTET_STRING attestationSignature = 1; + } + + request struct AddNOCRequest { + OCTET_STRING NOCValue = 0; + optional OCTET_STRING ICACValue = 1; + OCTET_STRING IPKValue = 2; + Int64u caseAdminSubject = 3; + VENDOR_ID adminVendorId = 4; + } + + request struct UpdateNOCRequest { + OCTET_STRING NOCValue = 0; + optional OCTET_STRING ICACValue = 1; + } + + response struct NOCResponse = 8 { + NodeOperationalCertStatusEnum statusCode = 0; + optional fabric_idx fabricIndex = 1; + optional CHAR_STRING debugText = 2; + } + + request struct UpdateFabricLabelRequest { + CHAR_STRING<32> label = 0; + } + + request struct RemoveFabricRequest { + fabric_idx fabricIndex = 0; + } + + request struct AddTrustedRootCertificateRequest { + OCTET_STRING rootCACertificate = 0; + } + + /** Sender is requesting attestation information from the receiver. */ + command access(invoke: administer) AttestationRequest(AttestationRequestRequest): AttestationResponse = 0; + /** Sender is requesting a device attestation certificate from the receiver. */ + command access(invoke: administer) CertificateChainRequest(CertificateChainRequestRequest): CertificateChainResponse = 2; + /** Sender is requesting a certificate signing request (CSR) from the receiver. */ + command access(invoke: administer) CSRRequest(CSRRequestRequest): CSRResponse = 4; + /** Sender is requesting to add the new node operational certificates. */ + command access(invoke: administer) AddNOC(AddNOCRequest): NOCResponse = 6; + /** Sender is requesting to update the node operational certificates. */ + fabric command access(invoke: administer) UpdateNOC(UpdateNOCRequest): NOCResponse = 7; + /** This command SHALL be used by an Administrative Node to set the user-visible Label field for a given Fabric, as reflected by entries in the Fabrics attribute. */ + fabric command access(invoke: administer) UpdateFabricLabel(UpdateFabricLabelRequest): NOCResponse = 9; + /** This command is used by Administrative Nodes to remove a given fabric index and delete all associated fabric-scoped data. */ + command access(invoke: administer) RemoveFabric(RemoveFabricRequest): NOCResponse = 10; + /** This command SHALL add a Trusted Root CA Certificate, provided as its CHIP Certificate representation. */ + command access(invoke: administer) AddTrustedRootCertificate(AddTrustedRootCertificateRequest): DefaultSuccess = 11; +} + +/** This cluster is used to add or remove Operational Credentials on a Commissionee or Node, as well as manage the associated Fabrics. */ +server cluster OperationalCredentials = 62 { + enum CertificateChainTypeEnum : ENUM8 { + kDACCertificate = 1; + kPAICertificate = 2; + } + + enum NodeOperationalCertStatusEnum : ENUM8 { + kOk = 0; + kInvalidPublicKey = 1; + kInvalidNodeOpId = 2; + kInvalidNOC = 3; + kMissingCsr = 4; + kTableFull = 5; + kInvalidAdminSubject = 6; + kFabricConflict = 9; + kLabelConflict = 10; + kInvalidFabricIndex = 11; + } + + fabric_scoped struct NOCStruct { + fabric_sensitive octet_string noc = 1; + nullable fabric_sensitive octet_string icac = 2; + fabric_idx fabricIndex = 254; + } + + fabric_scoped struct FabricDescriptorStruct { + octet_string<65> rootPublicKey = 1; + vendor_id vendorID = 2; + fabric_id fabricID = 3; + node_id nodeID = 4; + char_string<32> label = 5; + fabric_idx fabricIndex = 254; + } + + readonly attribute access(read: administer) NOCStruct NOCs[] = 0; + readonly attribute FabricDescriptorStruct fabrics[] = 1; + readonly attribute int8u supportedFabrics = 2; + readonly attribute int8u commissionedFabrics = 3; + readonly attribute OCTET_STRING trustedRootCertificates[] = 4; + readonly attribute int8u currentFabricIndex = 5; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct AttestationRequestRequest { + OCTET_STRING attestationNonce = 0; + } + + request struct CertificateChainRequestRequest { + CertificateChainTypeEnum certificateType = 0; + } + + request struct CSRRequestRequest { + OCTET_STRING CSRNonce = 0; + optional boolean isForUpdateNOC = 1; + } + + request struct AddNOCRequest { + OCTET_STRING NOCValue = 0; + optional OCTET_STRING ICACValue = 1; + OCTET_STRING IPKValue = 2; + Int64u caseAdminSubject = 3; + VENDOR_ID adminVendorId = 4; + } + + request struct UpdateNOCRequest { + OCTET_STRING NOCValue = 0; + optional OCTET_STRING ICACValue = 1; + } + + request struct UpdateFabricLabelRequest { + CHAR_STRING<32> label = 0; + } + + request struct RemoveFabricRequest { + fabric_idx fabricIndex = 0; + } + + request struct AddTrustedRootCertificateRequest { + OCTET_STRING rootCACertificate = 0; + } + + response struct AttestationResponse = 1 { + OCTET_STRING attestationElements = 0; + OCTET_STRING attestationSignature = 1; + } + + response struct CertificateChainResponse = 3 { + OCTET_STRING certificate = 0; + } + + response struct CSRResponse = 5 { + OCTET_STRING NOCSRElements = 0; + OCTET_STRING attestationSignature = 1; + } + + response struct NOCResponse = 8 { + NodeOperationalCertStatusEnum statusCode = 0; + optional fabric_idx fabricIndex = 1; + optional CHAR_STRING debugText = 2; + } + + command access(invoke: administer) AttestationRequest(AttestationRequestRequest): AttestationResponse = 0; + command access(invoke: administer) CertificateChainRequest(CertificateChainRequestRequest): CertificateChainResponse = 2; + command access(invoke: administer) CSRRequest(CSRRequestRequest): CSRResponse = 4; + command access(invoke: administer) AddNOC(AddNOCRequest): NOCResponse = 6; + fabric command access(invoke: administer) UpdateNOC(UpdateNOCRequest): NOCResponse = 7; + fabric command access(invoke: administer) UpdateFabricLabel(UpdateFabricLabelRequest): NOCResponse = 9; + command access(invoke: administer) RemoveFabric(RemoveFabricRequest): NOCResponse = 10; + command access(invoke: administer) AddTrustedRootCertificate(AddTrustedRootCertificateRequest): DefaultSuccess = 11; +} + +/** The Group Key Management Cluster is the mechanism by which group keys are managed. */ +server cluster GroupKeyManagement = 63 { + enum GroupKeySecurityPolicyEnum : ENUM8 { + kTrustFirst = 0; + kCacheAndSync = 1; + } + + fabric_scoped struct GroupKeyMapStruct { + group_id groupId = 1; + int16u groupKeySetID = 2; + fabric_idx fabricIndex = 254; + } + + fabric_scoped struct GroupInfoMapStruct { + group_id groupId = 1; + endpoint_no endpoints[] = 2; + optional char_string<16> groupName = 3; + fabric_idx fabricIndex = 254; + } + + struct GroupKeySetStruct { + int16u groupKeySetID = 0; + GroupKeySecurityPolicyEnum groupKeySecurityPolicy = 1; + nullable octet_string<16> epochKey0 = 2; + nullable epoch_us epochStartTime0 = 3; + nullable octet_string<16> epochKey1 = 4; + nullable epoch_us epochStartTime1 = 5; + nullable octet_string<16> epochKey2 = 6; + nullable epoch_us epochStartTime2 = 7; + } + + attribute access(write: manage) GroupKeyMapStruct groupKeyMap[] = 0; + readonly attribute GroupInfoMapStruct groupTable[] = 1; + readonly attribute int16u maxGroupsPerFabric = 2; + readonly attribute int16u maxGroupKeysPerFabric = 3; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct KeySetWriteRequest { + GroupKeySetStruct groupKeySet = 0; + } + + request struct KeySetReadRequest { + INT16U groupKeySetID = 0; + } + + request struct KeySetRemoveRequest { + INT16U groupKeySetID = 0; + } + + request struct KeySetReadAllIndicesRequest { + INT16U groupKeySetIDs[] = 0; + } + + response struct KeySetReadResponse = 2 { + GroupKeySetStruct groupKeySet = 0; + } + + response struct KeySetReadAllIndicesResponse = 5 { + INT16U groupKeySetIDs[] = 0; + } + + fabric command access(invoke: administer) KeySetWrite(KeySetWriteRequest): DefaultSuccess = 0; + fabric command access(invoke: administer) KeySetRead(KeySetReadRequest): KeySetReadResponse = 1; + fabric command access(invoke: administer) KeySetRemove(KeySetRemoveRequest): DefaultSuccess = 3; + fabric command access(invoke: administer) KeySetReadAllIndices(KeySetReadAllIndicesRequest): KeySetReadAllIndicesResponse = 4; +} + +/** The Fixed Label Cluster provides a feature for the device to tag an endpoint with zero or more read only +labels. */ +server cluster FixedLabel = 64 { + readonly attribute LabelStruct labelList[] = 0; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +/** The User Label Cluster provides a feature to tag an endpoint with zero or more labels. */ +server cluster UserLabel = 65 { + attribute access(write: manage) LabelStruct labelList[] = 0; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + +endpoint 0 { + device type rootdevice = 22, version 1; + binding cluster Binding; + binding cluster GeneralCommissioning; + binding cluster NetworkCommissioning; + binding cluster OperationalCredentials; + + server cluster Descriptor { + callback attribute deviceTypeList; + callback attribute serverList; + callback attribute clientList; + callback attribute partsList; + ram attribute featureMap default = 0; + callback attribute clusterRevision default = 1; + } + + server cluster Binding { + callback attribute binding; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster AccessControl { + emits event AccessControlEntryChanged; + emits event AccessControlExtensionChanged; + callback attribute acl; + callback attribute extension; + callback attribute subjectsPerAccessControlEntry default = 4; + callback attribute targetsPerAccessControlEntry default = 3; + callback attribute accessControlEntriesPerFabric default = 4; + callback attribute attributeList; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster BasicInformation { + emits event StartUp; + emits event ShutDown; + emits event Leave; + callback attribute dataModelRevision default = 10; + callback attribute vendorName; + callback attribute vendorID; + callback attribute productName; + callback attribute productID; + persist attribute nodeLabel; + callback attribute location default = "XX"; + callback attribute hardwareVersion default = 0; + callback attribute hardwareVersionString; + callback attribute softwareVersion default = 0; + callback attribute softwareVersionString; + callback attribute manufacturingDate default = "20210614123456ZZ"; + callback attribute partNumber; + callback attribute productURL; + callback attribute productLabel; + callback attribute serialNumber; + persist attribute localConfigDisabled default = 0; + ram attribute reachable default = 1; + callback attribute uniqueID; + callback attribute capabilityMinima; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster OtaSoftwareUpdateProvider { + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster LocalizationConfiguration { + persist attribute activeLocale default = "en-US"; + callback attribute supportedLocales; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster TimeFormatLocalization { + persist attribute hourFormat default = 0; + persist attribute activeCalendarType default = 0; + callback attribute supportedCalendarTypes; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster UnitLocalization { + persist attribute temperatureUnit default = 0; + ram attribute featureMap default = 0x1; + ram attribute clusterRevision default = 1; + } + + server cluster GeneralCommissioning { + ram attribute breadcrumb default = 0x0000000000000000; + callback attribute basicCommissioningInfo; + callback attribute regulatoryConfig default = 0; + callback attribute locationCapability default = 0; + callback attribute supportsConcurrentConnection default = 1; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster NetworkCommissioning { + ram attribute maxNetworks; + callback attribute networks; + ram attribute scanMaxTimeSeconds; + ram attribute connectMaxTimeSeconds; + ram attribute interfaceEnabled; + ram attribute lastNetworkingStatus; + ram attribute lastNetworkID; + ram attribute lastConnectErrorValue; + ram attribute featureMap default = 4; + ram attribute clusterRevision default = 1; + } + + server cluster DiagnosticLogs { + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster GeneralDiagnostics { + emits event BootReason; + callback attribute networkInterfaces; + callback attribute rebootCount default = 0x0000; + callback attribute upTime default = 0x0000000000000000; + callback attribute totalOperationalHours default = 0x00000000; + callback attribute bootReason; + callback attribute activeHardwareFaults; + callback attribute activeRadioFaults; + callback attribute activeNetworkFaults; + callback attribute testEventTriggersEnabled default = false; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster SoftwareDiagnostics { + emits event SoftwareFault; + callback attribute threadMetrics; + callback attribute currentHeapFree default = 0x0000000000000000; + callback attribute currentHeapUsed default = 0x0000000000000000; + callback attribute currentHeapHighWatermark default = 0x0000000000000000; + ram attribute featureMap default = 1; + ram attribute clusterRevision default = 1; + } + + server cluster ThreadNetworkDiagnostics { + emits event ConnectionStatus; + emits event NetworkFaultChange; + callback attribute channel; + callback attribute routingRole; + callback attribute networkName default = "0"; + callback attribute panId default = 0x0000; + callback attribute extendedPanId default = 0x0000000000000000; + callback attribute meshLocalPrefix; + callback attribute overrunCount default = 0x0000000000000000; + callback attribute neighborTable; + callback attribute routeTable; + callback attribute partitionId; + callback attribute weighting; + callback attribute dataVersion; + callback attribute stableDataVersion; + callback attribute leaderRouterId; + callback attribute detachedRoleCount default = 0x0000; + callback attribute childRoleCount default = 0x0000; + callback attribute routerRoleCount default = 0x0000; + callback attribute leaderRoleCount default = 0x0000; + callback attribute attachAttemptCount default = 0x0000; + callback attribute partitionIdChangeCount default = 0x0000; + callback attribute betterPartitionAttachAttemptCount default = 0x0000; + callback attribute parentChangeCount default = 0x0000; + callback attribute txTotalCount default = 0x0000; + callback attribute txUnicastCount default = 0x0000; + callback attribute txBroadcastCount default = 0x0000; + callback attribute txAckRequestedCount default = 0x0000; + callback attribute txAckedCount default = 0x0000; + callback attribute txNoAckRequestedCount default = 0x0000; + callback attribute txDataCount default = 0x0000; + callback attribute txDataPollCount default = 0x0000; + callback attribute txBeaconCount default = 0x0000; + callback attribute txBeaconRequestCount default = 0x0000; + callback attribute txOtherCount default = 0x0000; + callback attribute txRetryCount default = 0x0000; + callback attribute txDirectMaxRetryExpiryCount default = 0x0000; + callback attribute txIndirectMaxRetryExpiryCount default = 0x0000; + callback attribute txErrCcaCount default = 0x0000; + callback attribute txErrAbortCount default = 0x0000; + callback attribute txErrBusyChannelCount default = 0x0000; + callback attribute rxTotalCount default = 0x0000; + callback attribute rxUnicastCount default = 0x0000; + callback attribute rxBroadcastCount default = 0x0000; + callback attribute rxDataCount default = 0x0000; + callback attribute rxDataPollCount default = 0x0000; + callback attribute rxBeaconCount default = 0x0000; + callback attribute rxBeaconRequestCount default = 0x0000; + callback attribute rxOtherCount default = 0x0000; + callback attribute rxAddressFilteredCount default = 0x0000; + callback attribute rxDestAddrFilteredCount default = 0x0000; + callback attribute rxDuplicatedCount default = 0x0000; + callback attribute rxErrNoFrameCount default = 0x0000; + callback attribute rxErrUnknownNeighborCount default = 0x0000; + callback attribute rxErrInvalidSrcAddrCount default = 0x0000; + callback attribute rxErrSecCount default = 0x0000; + callback attribute rxErrFcsCount default = 0x0000; + callback attribute rxErrOtherCount default = 0x0000; + callback attribute activeTimestamp default = 0x0000000000000000; + callback attribute pendingTimestamp default = 0x0000000000000000; + callback attribute delay default = 0x0000; + callback attribute securityPolicy; + callback attribute channelPage0Mask default = "0x0000"; + callback attribute operationalDatasetComponents; + callback attribute activeNetworkFaultsList; + ram attribute featureMap default = 0x000F; + ram attribute clusterRevision default = 1; + } + + server cluster WiFiNetworkDiagnostics { + emits event Disconnection; + emits event AssociationFailure; + emits event ConnectionStatus; + callback attribute bssid; + callback attribute securityType; + callback attribute wiFiVersion; + callback attribute channelNumber default = 0x0000; + callback attribute rssi default = 0x00; + callback attribute beaconLostCount default = 0x00000000; + callback attribute beaconRxCount default = 0x00000000; + callback attribute packetMulticastRxCount default = 0x00000000; + callback attribute packetMulticastTxCount default = 0x00000000; + callback attribute packetUnicastRxCount default = 0x00000000; + callback attribute packetUnicastTxCount default = 0x00000000; + callback attribute currentMaxRate default = 0x0000000000000000; + callback attribute overrunCount default = 0x0000000000000000; + ram attribute featureMap default = 3; + ram attribute clusterRevision default = 1; + } + + server cluster EthernetNetworkDiagnostics { + callback attribute PHYRate; + callback attribute fullDuplex default = 0x00; + callback attribute packetRxCount default = 0x0000000000000000; + callback attribute packetTxCount default = 0x0000000000000000; + callback attribute txErrCount default = 0x0000000000000000; + callback attribute collisionCount default = 0x0000000000000000; + callback attribute overrunCount default = 0x0000000000000000; + callback attribute carrierDetect default = 0x00; + callback attribute timeSinceReset default = 0x0000000000000000; + ram attribute featureMap default = 3; + ram attribute clusterRevision default = 1; + } + + server cluster AdministratorCommissioning { + callback attribute windowStatus default = 0; + callback attribute adminFabricIndex default = 1; + callback attribute adminVendorId default = 0; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster OperationalCredentials { + callback attribute NOCs; + callback attribute fabrics; + callback attribute supportedFabrics; + callback attribute commissionedFabrics; + callback attribute trustedRootCertificates; + callback attribute currentFabricIndex; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster GroupKeyManagement { + callback attribute groupKeyMap; + callback attribute groupTable; + callback attribute maxGroupsPerFabric; + callback attribute maxGroupKeysPerFabric; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster FixedLabel { + callback attribute labelList; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } + + server cluster UserLabel { + callback attribute labelList; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } +} +endpoint 1 { + device type videoplayer = 256, version 1; + + server cluster Identify { + ram attribute identifyTime default = 0x0; + ram attribute identifyType default = 0x0; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute attributeList; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 2; + } + + server cluster Groups { + ram attribute nameSupport; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute attributeList; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 3; + } + + server cluster Scenes { + ram attribute sceneCount default = 0x00; + ram attribute currentScene default = 0x00; + ram attribute currentGroup default = 0x0000; + ram attribute sceneValid default = 0x00; + ram attribute nameSupport; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute attributeList; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 3; + } + + server cluster OnOff { + ram attribute onOff default = 0x00; + ram attribute globalSceneControl default = 1; + ram attribute onTime default = 0; + ram attribute offWaitTime default = 0; + ram attribute startUpOnOff; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute attributeList; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 4; + } + + server cluster Descriptor { + callback attribute deviceTypeList; + callback attribute serverList; + callback attribute clientList; + callback attribute partsList; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute attributeList; + ram attribute featureMap default = 0; + callback attribute clusterRevision default = 1; + } +} + + diff --git a/examples/st-device-app/st-device-common/st-device-app.zap b/examples/st-device-app/st-device-common/st-device-app.zap new file mode 100644 index 00000000000000..0ac09dd1ae0d2f --- /dev/null +++ b/examples/st-device-app/st-device-common/st-device-app.zap @@ -0,0 +1,15593 @@ +{ + "featureLevel": 95, + "creator": "zap", + "keyValuePairs": [ + { + "key": "commandDiscovery", + "value": "1" + }, + { + "key": "defaultResponsePolicy", + "value": "always" + }, + { + "key": "manufacturerCodes", + "value": "0x1002" + } + ], + "package": [ + { + "pathRelativity": "relativeToZap", + "path": "../../../src/app/zap-templates/zcl/zcl.json", + "type": "zcl-properties", + "category": "matter", + "version": 1, + "description": "Matter SDK ZCL data" + }, + { + "pathRelativity": "relativeToZap", + "path": "../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", + "version": "chip-v1" + } + ], + "endpointTypes": [ + { + "name": "MA-rootdevice", + "deviceTypeName": "MA-rootdevice", + "deviceTypeCode": 22, + "deviceTypeProfileId": 259, + "clusters": [ + { + "name": "Identify", + "code": 3, + "mfgCode": null, + "define": "IDENTIFY_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "Identify", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Identify", + "code": 3, + "mfgCode": null, + "define": "IDENTIFY_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "IdentifyTime", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Groups", + "code": 4, + "mfgCode": null, + "define": "GROUPS_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "AddGroup", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ViewGroup", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "GetGroupMembership", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveGroup", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveAllGroups", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "AddGroupIfIdentifying", + "code": 5, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Groups", + "code": 4, + "mfgCode": null, + "define": "GROUPS_CLUSTER", + "side": "server", + "enabled": 0, + "commands": [ + { + "name": "AddGroupResponse", + "code": 0, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ViewGroupResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "GetGroupMembershipResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveGroupResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "NameSupport", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Scenes", + "code": 5, + "mfgCode": null, + "define": "SCENES_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "AddScene", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ViewScene", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveScene", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveAllScenes", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StoreScene", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RecallScene", + "code": 5, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "GetSceneMembership", + "code": 6, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Scenes", + "code": 5, + "mfgCode": null, + "define": "SCENES_CLUSTER", + "side": "server", + "enabled": 0, + "commands": [ + { + "name": "AddSceneResponse", + "code": 0, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ViewSceneResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveSceneResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveAllScenesResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StoreSceneResponse", + "code": 4, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "GetSceneMembershipResponse", + "code": 6, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "SceneCount", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CurrentScene", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CurrentGroup", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "group_id", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SceneValid", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "NameSupport", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "On/Off", + "code": 6, + "mfgCode": null, + "define": "ON_OFF_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "Off", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "On", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "Toggle", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "On/Off", + "code": 6, + "mfgCode": null, + "define": "ON_OFF_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "OnOff", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Level Control", + "code": 8, + "mfgCode": null, + "define": "LEVEL_CONTROL_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "MoveToLevel", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "Move", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "Step", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "Stop", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "MoveToLevelWithOnOff", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "MoveWithOnOff", + "code": 5, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StepWithOnOff", + "code": 6, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StopWithOnOff", + "code": 7, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Level Control", + "code": 8, + "mfgCode": null, + "define": "LEVEL_CONTROL_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "CurrentLevel", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Descriptor", + "code": 29, + "mfgCode": null, + "define": "DESCRIPTOR_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Descriptor", + "code": 29, + "mfgCode": null, + "define": "DESCRIPTOR_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "DeviceTypeList", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ServerList", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClientList", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "PartsList", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Binding", + "code": 30, + "mfgCode": null, + "define": "BINDING_CLUSTER", + "side": "client", + "enabled": 1, + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Binding", + "code": 30, + "mfgCode": null, + "define": "BINDING_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "Binding", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Access Control", + "code": 31, + "mfgCode": null, + "define": "ACCESS_CONTROL_CLUSTER", + "side": "client", + "enabled": 0 + }, + { + "name": "Access Control", + "code": 31, + "mfgCode": null, + "define": "ACCESS_CONTROL_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "ACL", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Extension", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SubjectsPerAccessControlEntry", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "TargetsPerAccessControlEntry", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AccessControlEntriesPerFabric", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "AccessControlEntryChanged", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "AccessControlExtensionChanged", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + }, + { + "name": "Basic Information", + "code": 40, + "mfgCode": null, + "define": "BASIC_INFORMATION_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Basic Information", + "code": 40, + "mfgCode": null, + "define": "BASIC_INFORMATION_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "DataModelRevision", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "10", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "VendorName", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "VendorID", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "vendor_id", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ProductName", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ProductID", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "NodeLabel", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "NVM", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Location", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "XX", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "HardwareVersion", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "HardwareVersionString", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SoftwareVersion", + "code": 9, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SoftwareVersionString", + "code": 10, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ManufacturingDate", + "code": 11, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "20210614123456ZZ", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "PartNumber", + "code": 12, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ProductURL", + "code": 13, + "mfgCode": null, + "side": "server", + "type": "long_char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ProductLabel", + "code": 14, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SerialNumber", + "code": 15, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "LocalConfigDisabled", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "NVM", + "singleton": 1, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Reachable", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "UniqueID", + "code": 18, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CapabilityMinima", + "code": 19, + "mfgCode": null, + "side": "server", + "type": "CapabilityMinimaStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "StartUp", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "ShutDown", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "Leave", + "code": 2, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + }, + { + "name": "OTA Software Update Provider", + "code": 41, + "mfgCode": null, + "define": "OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "QueryImage", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ApplyUpdateRequest", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "NotifyUpdateApplied", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "OTA Software Update Provider", + "code": 41, + "mfgCode": null, + "define": "OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "QueryImageResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + }, + { + "name": "ApplyUpdateResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Localization Configuration", + "code": 43, + "mfgCode": null, + "define": "LOCALIZATION_CONFIGURATION_CLUSTER", + "side": "client", + "enabled": 0 + }, + { + "name": "Localization Configuration", + "code": 43, + "mfgCode": null, + "define": "LOCALIZATION_CONFIGURATION_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "ActiveLocale", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": 0, + "defaultValue": "en-US", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SupportedLocales", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Time Format Localization", + "code": 44, + "mfgCode": null, + "define": "TIME_FORMAT_LOCALIZATION_CLUSTER", + "side": "client", + "enabled": 0 + }, + { + "name": "Time Format Localization", + "code": 44, + "mfgCode": null, + "define": "TIME_FORMAT_LOCALIZATION_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "HourFormat", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "HourFormatEnum", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveCalendarType", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "CalendarTypeEnum", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SupportedCalendarTypes", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Unit Localization", + "code": 45, + "mfgCode": null, + "define": "UNIT_LOCALIZATION_CLUSTER", + "side": "client", + "enabled": 0 + }, + { + "name": "Unit Localization", + "code": 45, + "mfgCode": null, + "define": "UNIT_LOCALIZATION_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "TemperatureUnit", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "TempUnitEnum", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "General Commissioning", + "code": 48, + "mfgCode": null, + "define": "GENERAL_COMMISSIONING_CLUSTER", + "side": "client", + "enabled": 1, + "commands": [ + { + "name": "ArmFailSafe", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "SetRegulatoryConfig", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "CommissioningComplete", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "General Commissioning", + "code": 48, + "mfgCode": null, + "define": "GENERAL_COMMISSIONING_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "ArmFailSafeResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "SetRegulatoryConfigResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "CommissioningCompleteResponse", + "code": 5, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "Breadcrumb", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "BasicCommissioningInfo", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "BasicCommissioningInfo", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RegulatoryConfig", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "RegulatoryLocationType", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LocationCapability", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "RegulatoryLocationType", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SupportsConcurrentConnection", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Network Commissioning", + "code": 49, + "mfgCode": null, + "define": "NETWORK_COMMISSIONING_CLUSTER", + "side": "client", + "enabled": 1, + "commands": [ + { + "name": "ScanNetworks", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "AddOrUpdateWiFiNetwork", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "AddOrUpdateThreadNetwork", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveNetwork", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ConnectNetwork", + "code": 6, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ReorderNetwork", + "code": 8, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Network Commissioning", + "code": 49, + "mfgCode": null, + "define": "NETWORK_COMMISSIONING_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "ScanNetworksResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "NetworkConfigResponse", + "code": 5, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ConnectNetworkResponse", + "code": 7, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "MaxNetworks", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Networks", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ScanMaxTimeSeconds", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ConnectMaxTimeSeconds", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "InterfaceEnabled", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LastNetworkingStatus", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "NetworkCommissioningStatus", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LastNetworkID", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "octet_string", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LastConnectErrorValue", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int32s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Diagnostic Logs", + "code": 50, + "mfgCode": null, + "define": "DIAGNOSTIC_LOGS_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "RetrieveLogsRequest", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "General Diagnostics", + "code": 51, + "mfgCode": null, + "define": "GENERAL_DIAGNOSTICS_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "General Diagnostics", + "code": 51, + "mfgCode": null, + "define": "GENERAL_DIAGNOSTICS_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "TestEventTrigger", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ], + "attributes": [ + { + "name": "NetworkInterfaces", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RebootCount", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "UpTime", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "TotalOperationalHours", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BootReason", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "BootReasonEnum", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveHardwareFaults", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveRadioFaults", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveNetworkFaults", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "TestEventTriggersEnabled", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "false", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "BootReason", + "code": 3, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + }, + { + "name": "Software Diagnostics", + "code": 52, + "mfgCode": null, + "define": "SOFTWARE_DIAGNOSTICS_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "ResetWatermarks", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 0, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Software Diagnostics", + "code": 52, + "mfgCode": null, + "define": "SOFTWARE_DIAGNOSTICS_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "ThreadMetrics", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentHeapFree", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentHeapUsed", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentHeapHighWatermark", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "SoftwareFault", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + }, + { + "name": "Thread Network Diagnostics", + "code": 53, + "mfgCode": null, + "define": "THREAD_NETWORK_DIAGNOSTICS_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "Channel", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RoutingRole", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "RoutingRole", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "NetworkName", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "PanId", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ExtendedPanId", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "MeshLocalPrefix", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "octet_string", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "OverrunCount", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "NeighborTable", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RouteTable", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "PartitionId", + "code": 9, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Weighting", + "code": 10, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "DataVersion", + "code": 11, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "StableDataVersion", + "code": 12, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "LeaderRouterId", + "code": 13, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "DetachedRoleCount", + "code": 14, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ChildRoleCount", + "code": 15, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RouterRoleCount", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "LeaderRoleCount", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "AttachAttemptCount", + "code": 18, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "PartitionIdChangeCount", + "code": 19, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "BetterPartitionAttachAttemptCount", + "code": 20, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ParentChangeCount", + "code": 21, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxTotalCount", + "code": 22, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxUnicastCount", + "code": 23, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxBroadcastCount", + "code": 24, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxAckRequestedCount", + "code": 25, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxAckedCount", + "code": 26, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxNoAckRequestedCount", + "code": 27, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxDataCount", + "code": 28, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxDataPollCount", + "code": 29, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxBeaconCount", + "code": 30, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxBeaconRequestCount", + "code": 31, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxOtherCount", + "code": 32, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxRetryCount", + "code": 33, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxDirectMaxRetryExpiryCount", + "code": 34, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxIndirectMaxRetryExpiryCount", + "code": 35, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxErrCcaCount", + "code": 36, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxErrAbortCount", + "code": 37, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxErrBusyChannelCount", + "code": 38, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxTotalCount", + "code": 39, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxUnicastCount", + "code": 40, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxBroadcastCount", + "code": 41, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxDataCount", + "code": 42, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxDataPollCount", + "code": 43, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxBeaconCount", + "code": 44, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxBeaconRequestCount", + "code": 45, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxOtherCount", + "code": 46, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxAddressFilteredCount", + "code": 47, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxDestAddrFilteredCount", + "code": 48, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxDuplicatedCount", + "code": 49, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxErrNoFrameCount", + "code": 50, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxErrUnknownNeighborCount", + "code": 51, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxErrInvalidSrcAddrCount", + "code": 52, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxErrSecCount", + "code": 53, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxErrFcsCount", + "code": 54, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxErrOtherCount", + "code": 55, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ActiveTimestamp", + "code": 56, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PendingTimestamp", + "code": 57, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Delay", + "code": 58, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SecurityPolicy", + "code": 59, + "mfgCode": null, + "side": "server", + "type": "SecurityPolicy", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ChannelPage0Mask", + "code": 60, + "mfgCode": null, + "side": "server", + "type": "octet_string", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "OperationalDatasetComponents", + "code": 61, + "mfgCode": null, + "side": "server", + "type": "OperationalDatasetComponents", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ActiveNetworkFaultsList", + "code": 62, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x000F", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "ConnectionStatus", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "NetworkFaultChange", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + }, + { + "name": "WiFi Network Diagnostics", + "code": 54, + "mfgCode": null, + "define": "WIFI_NETWORK_DIAGNOSTICS_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "WiFi Network Diagnostics", + "code": 54, + "mfgCode": null, + "define": "WIFI_NETWORK_DIAGNOSTICS_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "BSSID", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "octet_string", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SecurityType", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "SecurityTypeEnum", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "WiFiVersion", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "WiFiVersionEnum", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ChannelNumber", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RSSI", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int8s", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "BeaconLostCount", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BeaconRxCount", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PacketMulticastRxCount", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PacketMulticastTxCount", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PacketUnicastRxCount", + "code": 9, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PacketUnicastTxCount", + "code": 10, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentMaxRate", + "code": 11, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OverrunCount", + "code": 12, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "Disconnection", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "AssociationFailure", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "ConnectionStatus", + "code": 2, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + }, + { + "name": "Ethernet Network Diagnostics", + "code": 55, + "mfgCode": null, + "define": "ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "ResetCounts", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Ethernet Network Diagnostics", + "code": 55, + "mfgCode": null, + "define": "ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "PHYRate", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "PHYRateEnum", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FullDuplex", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PacketRxCount", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "PacketTxCount", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxErrCount", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CollisionCount", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "OverrunCount", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CarrierDetect", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "TimeSinceReset", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Switch", + "code": 59, + "mfgCode": null, + "define": "SWITCH_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Switch", + "code": 59, + "mfgCode": null, + "define": "SWITCH_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "NumberOfPositions", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CurrentPosition", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "MultiPressMax", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Administrator Commissioning", + "code": 60, + "mfgCode": null, + "define": "ADMINISTRATOR_COMMISSIONING_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "OpenCommissioningWindow", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "OpenBasicCommissioningWindow", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RevokeCommissioning", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Administrator Commissioning", + "code": 60, + "mfgCode": null, + "define": "ADMINISTRATOR_COMMISSIONING_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "WindowStatus", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "CommissioningWindowStatusEnum", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AdminFabricIndex", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "fabric_idx", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AdminVendorId", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Operational Credentials", + "code": 62, + "mfgCode": null, + "define": "OPERATIONAL_CREDENTIALS_CLUSTER", + "side": "client", + "enabled": 1, + "commands": [ + { + "name": "AttestationRequest", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "CertificateChainRequest", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "CSRRequest", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "AddNOC", + "code": 6, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "UpdateNOC", + "code": 7, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "UpdateFabricLabel", + "code": 9, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveFabric", + "code": 10, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "AddTrustedRootCertificate", + "code": 11, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Operational Credentials", + "code": 62, + "mfgCode": null, + "define": "OPERATIONAL_CREDENTIALS_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "AttestationResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "CertificateChainResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "CSRResponse", + "code": 5, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "NOCResponse", + "code": 8, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "NOCs", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Fabrics", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SupportedFabrics", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CommissionedFabrics", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TrustedRootCertificates", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CurrentFabricIndex", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Group Key Management", + "code": 63, + "mfgCode": null, + "define": "GROUP_KEY_MANAGEMENT_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "KeySetWrite", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "KeySetRead", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "KeySetRemove", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "KeySetReadAllIndices", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Group Key Management", + "code": 63, + "mfgCode": null, + "define": "GROUP_KEY_MANAGEMENT_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "KeySetReadResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + }, + { + "name": "KeySetReadAllIndicesResponse", + "code": 5, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "GroupKeyMap", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "GroupTable", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "MaxGroupsPerFabric", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MaxGroupKeysPerFabric", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Fixed Label", + "code": 64, + "mfgCode": null, + "define": "FIXED_LABEL_CLUSTER", + "side": "client", + "enabled": 0 + }, + { + "name": "Fixed Label", + "code": 64, + "mfgCode": null, + "define": "FIXED_LABEL_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "LabelList", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "User Label", + "code": 65, + "mfgCode": null, + "define": "USER_LABEL_CLUSTER", + "side": "client", + "enabled": 0 + }, + { + "name": "User Label", + "code": 65, + "mfgCode": null, + "define": "USER_LABEL_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "LabelList", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Door Lock", + "code": 257, + "mfgCode": null, + "define": "DOOR_LOCK_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "LockDoor", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "UnlockDoor", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "UnlockWithTimeout", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "SetWeekDaySchedule", + "code": 11, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "GetWeekDaySchedule", + "code": 12, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ClearWeekDaySchedule", + "code": 13, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "SetYearDaySchedule", + "code": 14, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "GetYearDaySchedule", + "code": 15, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ClearYearDaySchedule", + "code": 16, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "SetHolidaySchedule", + "code": 17, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "GetHolidaySchedule", + "code": 18, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ClearHolidaySchedule", + "code": 19, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "6", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Door Lock", + "code": 257, + "mfgCode": null, + "define": "DOOR_LOCK_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "LockState", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "DlLockState", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "LockType", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "DlLockType", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ActuatorEnabled", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "DoorState", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "DoorStateEnum", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Language", + "code": 33, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "LEDSettings", + "code": 34, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "AutoRelockTime", + "code": 35, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SoundVolume", + "code": 36, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "OperatingMode", + "code": 37, + "mfgCode": null, + "side": "server", + "type": "OperatingModeEnum", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "DefaultConfigurationRegister", + "code": 39, + "mfgCode": null, + "side": "server", + "type": "DlDefaultConfigurationRegister", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "EnableLocalProgramming", + "code": 40, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x01", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "EnableOneTouchLocking", + "code": 41, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "EnableInsideStatusLED", + "code": 42, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "EnablePrivacyModeButton", + "code": 43, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "WrongCodeEntryLimit", + "code": 48, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "UserCodeTemporaryDisableTime", + "code": 49, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SendPINOverTheAir", + "code": 50, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RequirePINforRemoteOperation", + "code": 51, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "6", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Barrier Control", + "code": 259, + "mfgCode": null, + "define": "BARRIER_CONTROL_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "BarrierControlGoToPercent", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "BarrierControlStop", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Barrier Control", + "code": 259, + "mfgCode": null, + "define": "BARRIER_CONTROL_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "barrier moving state", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "barrier safety status", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "bitmap16", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "barrier capabilities", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "barrier position", + "code": 10, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Color Control", + "code": 768, + "mfgCode": null, + "define": "COLOR_CONTROL_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "MoveToHue", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "MoveHue", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StepHue", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "MoveToSaturation", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "MoveSaturation", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StepSaturation", + "code": 5, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "MoveToHueAndSaturation", + "code": 6, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "MoveToColor", + "code": 7, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "MoveColor", + "code": 8, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StepColor", + "code": 9, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "MoveToColorTemperature", + "code": 10, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StopMoveStep", + "code": 71, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "MoveColorTemperature", + "code": 75, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StepColorTemperature", + "code": 76, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Color Control", + "code": 768, + "mfgCode": null, + "define": "COLOR_CONTROL_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "CurrentHue", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CurrentSaturation", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RemainingTime", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CurrentX", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x616B", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CurrentY", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x607D", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "DriftCompensation", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CompensationText", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorTemperatureMireds", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00FA", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorMode", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x01", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Options", + "code": 15, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "NumberOfPrimaries", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary1X", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary1Y", + "code": 18, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary1Intensity", + "code": 19, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary2X", + "code": 21, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary2Y", + "code": 22, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary2Intensity", + "code": 23, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary3X", + "code": 25, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary3Y", + "code": 26, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary3Intensity", + "code": 27, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary4X", + "code": 32, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary4Y", + "code": 33, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary4Intensity", + "code": 34, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary5X", + "code": 36, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary5Y", + "code": 37, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary5Intensity", + "code": 38, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary6X", + "code": 40, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary6Y", + "code": 41, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Primary6Intensity", + "code": 42, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "WhitePointX", + "code": 48, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "WhitePointY", + "code": 49, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorPointRX", + "code": 50, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorPointRY", + "code": 51, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorPointRIntensity", + "code": 52, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorPointGX", + "code": 54, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorPointGY", + "code": 55, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorPointGIntensity", + "code": 56, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorPointBX", + "code": 58, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorPointBY", + "code": 59, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorPointBIntensity", + "code": 60, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "EnhancedCurrentHue", + "code": 16384, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "EnhancedColorMode", + "code": 16385, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x01", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorLoopActive", + "code": 16386, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorLoopDirection", + "code": 16387, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorLoopTime", + "code": 16388, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0019", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorCapabilities", + "code": 16394, + "mfgCode": null, + "side": "server", + "type": "bitmap16", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorTempPhysicalMinMireds", + "code": 16395, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ColorTempPhysicalMaxMireds", + "code": 16396, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0xFEFF", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CoupleColorTempToLevelMinMireds", + "code": 16397, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "StartUpColorTemperatureMireds", + "code": 16400, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Temperature Measurement", + "code": 1026, + "mfgCode": null, + "define": "TEMPERATURE_MEASUREMENT_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Temperature Measurement", + "code": 1026, + "mfgCode": null, + "define": "TEMPERATURE_MEASUREMENT_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "MeasuredValue", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x8000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "MinMeasuredValue", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x8000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "MaxMeasuredValue", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x8000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Tolerance", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Relative Humidity Measurement", + "code": 1029, + "mfgCode": null, + "define": "RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Relative Humidity Measurement", + "code": 1029, + "mfgCode": null, + "define": "RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "MeasuredValue", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "MinMeasuredValue", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "MaxMeasuredValue", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Tolerance", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + } + ] + }, + { + "name": "MA-videoplayer", + "deviceTypeName": "MA-onofflight", + "deviceTypeCode": 256, + "deviceTypeProfileId": 259, + "clusters": [ + { + "name": "Identify", + "code": 3, + "mfgCode": null, + "define": "IDENTIFY_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "Identify", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "TriggerEffect", + "code": 64, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Identify", + "code": 3, + "mfgCode": null, + "define": "IDENTIFY_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "IdentifyTime", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "IdentifyType", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Groups", + "code": 4, + "mfgCode": null, + "define": "GROUPS_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "AddGroup", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "ViewGroup", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "GetGroupMembership", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "RemoveGroup", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "RemoveAllGroups", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "AddGroupIfIdentifying", + "code": 5, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Groups", + "code": 4, + "mfgCode": null, + "define": "GROUPS_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "AddGroupResponse", + "code": 0, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + }, + { + "name": "ViewGroupResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + }, + { + "name": "GetGroupMembershipResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + }, + { + "name": "RemoveGroupResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "NameSupport", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Scenes", + "code": 5, + "mfgCode": null, + "define": "SCENES_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "AddScene", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ViewScene", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveScene", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveAllScenes", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StoreScene", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RecallScene", + "code": 5, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "GetSceneMembership", + "code": 6, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Scenes", + "code": 5, + "mfgCode": null, + "define": "SCENES_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "AddSceneResponse", + "code": 0, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ViewSceneResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveSceneResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RemoveAllScenesResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StoreSceneResponse", + "code": 4, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "GetSceneMembershipResponse", + "code": 6, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "SceneCount", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentScene", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentGroup", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "group_id", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SceneValid", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "NameSupport", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LastConfiguredBy", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "node_id", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "On/Off", + "code": 6, + "mfgCode": null, + "define": "ON_OFF_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "Off", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "On", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "Toggle", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "OffWithEffect", + "code": 64, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "OnWithRecallGlobalScene", + "code": 65, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "OnWithTimedOff", + "code": 66, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "On/Off", + "code": 6, + "mfgCode": null, + "define": "ON_OFF_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "OnOff", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 0, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "GlobalSceneControl", + "code": 16384, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OnTime", + "code": 16385, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OffWaitTime", + "code": 16386, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "StartUpOnOff", + "code": 16387, + "mfgCode": null, + "side": "server", + "type": "OnOffStartUpOnOff", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Level Control", + "code": 8, + "mfgCode": null, + "define": "LEVEL_CONTROL_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "MoveToLevel", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "Move", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "Step", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "Stop", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "MoveToLevelWithOnOff", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "MoveWithOnOff", + "code": 5, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "StepWithOnOff", + "code": 6, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "StopWithOnOff", + "code": 7, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Level Control", + "code": 8, + "mfgCode": null, + "define": "LEVEL_CONTROL_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "CurrentLevel", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "RemainingTime", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MinLevel", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MaxLevel", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0xFE", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentFrequency", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MinFrequency", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MaxFrequency", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Options", + "code": 15, + "mfgCode": null, + "side": "server", + "type": "LevelControlOptions", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OnOffTransitionTime", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OnLevel", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OnTransitionTime", + "code": 18, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OffTransitionTime", + "code": 19, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "DefaultMoveRate", + "code": 20, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "StartUpCurrentLevel", + "code": 16384, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Descriptor", + "code": 29, + "mfgCode": null, + "define": "DESCRIPTOR_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Descriptor", + "code": 29, + "mfgCode": null, + "define": "DESCRIPTOR_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "DeviceTypeList", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ServerList", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClientList", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PartsList", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Binding", + "code": 30, + "mfgCode": null, + "define": "BINDING_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Binding", + "code": 30, + "mfgCode": null, + "define": "BINDING_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "Binding", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Power Source", + "code": 47, + "mfgCode": null, + "define": "POWER_SOURCE_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Power Source", + "code": 47, + "mfgCode": null, + "define": "POWER_SOURCE_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "Status", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "PowerSourceStatusEnum", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Order", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Description", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "WiredAssessedInputVoltage", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "WiredAssessedInputFrequency", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "WiredCurrentType", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "WiredCurrentTypeEnum", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "WiredAssessedCurrent", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "WiredNominalVoltage", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "WiredMaximumCurrent", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "WiredPresent", + "code": 9, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveWiredFaults", + "code": 10, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatVoltage", + "code": 11, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatPercentRemaining", + "code": 12, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatTimeRemaining", + "code": 13, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatChargeLevel", + "code": 14, + "mfgCode": null, + "side": "server", + "type": "BatChargeLevelEnum", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatReplacementNeeded", + "code": 15, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatReplaceability", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "BatReplaceabilityEnum", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatPresent", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveBatFaults", + "code": 18, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatReplacementDescription", + "code": 19, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatCommonDesignation", + "code": 20, + "mfgCode": null, + "side": "server", + "type": "BatCommonDesignationEnum", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatANSIDesignation", + "code": 21, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatIECDesignation", + "code": 22, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatApprovedChemistry", + "code": 23, + "mfgCode": null, + "side": "server", + "type": "BatApprovedChemistryEnum", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatCapacity", + "code": 24, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatQuantity", + "code": 25, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatChargeState", + "code": 26, + "mfgCode": null, + "side": "server", + "type": "BatChargeStateEnum", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatTimeToFullCharge", + "code": 27, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatFunctionalWhileCharging", + "code": 28, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "BatChargingCurrent", + "code": 29, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveBatChargeFaults", + "code": 30, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Boolean State", + "code": 69, + "mfgCode": null, + "define": "BOOLEAN_STATE_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Boolean State", + "code": 69, + "mfgCode": null, + "define": "BOOLEAN_STATE_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "StateValue", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Door Lock", + "code": 257, + "mfgCode": null, + "define": "DOOR_LOCK_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "LockDoor", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "UnlockDoor", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "UnlockWithTimeout", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "SetWeekDaySchedule", + "code": 11, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "GetWeekDaySchedule", + "code": 12, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "ClearWeekDaySchedule", + "code": 13, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "SetYearDaySchedule", + "code": 14, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "GetYearDaySchedule", + "code": 15, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "ClearYearDaySchedule", + "code": 16, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "SetUser", + "code": 26, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "GetUser", + "code": 27, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "ClearUser", + "code": 29, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "SetCredential", + "code": 34, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "GetCredentialStatus", + "code": 36, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "ClearCredential", + "code": 38, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ] + }, + { + "name": "Door Lock", + "code": 257, + "mfgCode": null, + "define": "DOOR_LOCK_CLUSTER", + "side": "server", + "enabled": 0, + "commands": [ + { + "name": "GetWeekDayScheduleResponse", + "code": 12, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + }, + { + "name": "GetYearDayScheduleResponse", + "code": 15, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + }, + { + "name": "GetUserResponse", + "code": 28, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + }, + { + "name": "SetCredentialResponse", + "code": 35, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + }, + { + "name": "GetCredentialStatusResponse", + "code": 37, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "LockState", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "DlLockState", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LockType", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "DlLockType", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActuatorEnabled", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "DoorState", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "DoorStateEnum", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "NumberOfTotalUsersSupported", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "10", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "NumberOfPINUsersSupported", + "code": 18, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "10", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "NumberOfRFIDUsersSupported", + "code": 19, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "10", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "NumberOfWeekDaySchedulesSupportedPerUser", + "code": 20, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "10", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "NumberOfYearDaySchedulesSupportedPerUser", + "code": 21, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "10", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MaxPINCodeLength", + "code": 23, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "8", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MinPINCodeLength", + "code": 24, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "6", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MaxRFIDCodeLength", + "code": 25, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "20", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MinRFIDCodeLength", + "code": 26, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "10", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CredentialRulesSupport", + "code": 27, + "mfgCode": null, + "side": "server", + "type": "DlCredentialRuleMask", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Language", + "code": 33, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "en", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LEDSettings", + "code": 34, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AutoRelockTime", + "code": 35, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "60", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SoundVolume", + "code": 36, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OperatingMode", + "code": 37, + "mfgCode": null, + "side": "server", + "type": "OperatingModeEnum", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SupportedOperatingModes", + "code": 38, + "mfgCode": null, + "side": "server", + "type": "DlSupportedOperatingModes", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0xFFF6", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EnableOneTouchLocking", + "code": 41, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EnablePrivacyModeButton", + "code": 43, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "WrongCodeEntryLimit", + "code": 48, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "UserCodeTemporaryDisableTime", + "code": 49, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "10", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "RequirePINforRemoteOperation", + "code": 51, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x193", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "6", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Window Covering", + "code": 258, + "mfgCode": null, + "define": "WINDOW_COVERING_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "UpOrOpen", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "DownOrClose", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StopMotion", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "GoToLiftValue", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "GoToLiftPercentage", + "code": 5, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "GoToTiltValue", + "code": 7, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "GoToTiltPercentage", + "code": 8, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Window Covering", + "code": 258, + "mfgCode": null, + "define": "WINDOW_COVERING_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "Type", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "Type", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PhysicalClosedLimitLift", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PhysicalClosedLimitTilt", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentPositionLift", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentPositionTilt", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "NumberOfActuationsLift", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "NumberOfActuationsTilt", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ConfigStatus", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "ConfigStatus", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentPositionLiftPercentage", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "Percent", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentPositionTiltPercentage", + "code": 9, + "mfgCode": null, + "side": "server", + "type": "Percent", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OperationalStatus", + "code": 10, + "mfgCode": null, + "side": "server", + "type": "OperationalStatus", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0C", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "TargetPositionLiftPercent100ths", + "code": 11, + "mfgCode": null, + "side": "server", + "type": "Percent100ths", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "TargetPositionTiltPercent100ths", + "code": 12, + "mfgCode": null, + "side": "server", + "type": "Percent100ths", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EndProductType", + "code": 13, + "mfgCode": null, + "side": "server", + "type": "EndProductType", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentPositionLiftPercent100ths", + "code": 14, + "mfgCode": null, + "side": "server", + "type": "Percent100ths", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentPositionTiltPercent100ths", + "code": 15, + "mfgCode": null, + "side": "server", + "type": "Percent100ths", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "InstalledOpenLimitLift", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "InstalledClosedLimitLift", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0xFFFF", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "InstalledOpenLimitTilt", + "code": 18, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "InstalledClosedLimitTilt", + "code": 19, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0xFFFF", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Mode", + "code": 23, + "mfgCode": null, + "side": "server", + "type": "Mode", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SafetyStatus", + "code": 26, + "mfgCode": null, + "side": "server", + "type": "SafetyStatus", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Thermostat", + "code": 513, + "mfgCode": null, + "define": "THERMOSTAT_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "SetpointRaiseLower", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Thermostat", + "code": 513, + "mfgCode": null, + "define": "THERMOSTAT_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "LocalTemperature", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OutdoorTemperature", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Occupancy", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x01", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AbsMinHeatSetpointLimit", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "700", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AbsMaxHeatSetpointLimit", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AbsMinCoolSetpointLimit", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1600", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AbsMaxCoolSetpointLimit", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3200", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PICoolingDemand", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PIHeatingDemand", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "HVACSystemTypeConfiguration", + "code": 9, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LocalTemperatureCalibration", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "int8s", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OccupiedCoolingSetpoint", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2600", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OccupiedHeatingSetpoint", + "code": 18, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "UnoccupiedCoolingSetpoint", + "code": 19, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2600", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "UnoccupiedHeatingSetpoint", + "code": 20, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MinHeatSetpointLimit", + "code": 21, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "700", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MaxHeatSetpointLimit", + "code": 22, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MinCoolSetpointLimit", + "code": 23, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1600", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MaxCoolSetpointLimit", + "code": 24, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3200", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MinSetpointDeadBand", + "code": 25, + "mfgCode": null, + "side": "server", + "type": "int8s", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "25", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "RemoteSensing", + "code": 26, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ControlSequenceOfOperation", + "code": 27, + "mfgCode": null, + "side": "server", + "type": "ThermostatControlSequence", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x04", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SystemMode", + "code": 28, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x01", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ThermostatRunningMode", + "code": 30, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "StartOfWeek", + "code": 32, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "NumberOfWeeklyTransitions", + "code": 33, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "NumberOfDailyTransitions", + "code": 34, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "TemperatureSetpointHold", + "code": 35, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "TemperatureSetpointHoldDuration", + "code": 36, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0xFFFF", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ThermostatProgrammingOperationMode", + "code": 37, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ThermostatRunningState", + "code": 41, + "mfgCode": null, + "side": "server", + "type": "bitmap16", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SetpointChangeSource", + "code": 48, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SetpointChangeAmount", + "code": 49, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x8000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SetpointChangeSourceTimestamp", + "code": 50, + "mfgCode": null, + "side": "server", + "type": "epoch_s", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OccupiedSetback", + "code": 52, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OccupiedSetbackMin", + "code": 53, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OccupiedSetbackMax", + "code": 54, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "UnoccupiedSetback", + "code": 55, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "UnoccupiedSetbackMin", + "code": 56, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "UnoccupiedSetbackMax", + "code": 57, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EmergencyHeatDelta", + "code": 58, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ACType", + "code": 64, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ACCapacity", + "code": 65, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ACRefrigerantType", + "code": 66, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ACCompressorType", + "code": 67, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ACErrorCode", + "code": 68, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ACLouverPosition", + "code": 69, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ACCoilTemperature", + "code": 70, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x8000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ACCapacityformat", + "code": 71, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Fan Control", + "code": 514, + "mfgCode": null, + "define": "FAN_CONTROL_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Fan Control", + "code": 514, + "mfgCode": null, + "define": "FAN_CONTROL_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "FanMode", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "FanModeType", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FanModeSequence", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "FanModeSequenceType", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PercentSetting", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PercentCurrent", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SpeedMax", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SpeedSetting", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SpeedCurrent", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "RockSupport", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "RockSetting", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "WindSupport", + "code": 9, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "WindSetting", + "code": 10, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Color Control", + "code": 768, + "mfgCode": null, + "define": "COLOR_CONTROL_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "MoveToHue", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "MoveToSaturation", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "MoveToHueAndSaturation", + "code": 6, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "MoveToColor", + "code": 7, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "MoveToColorTemperature", + "code": 10, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Color Control", + "code": 768, + "mfgCode": null, + "define": "COLOR_CONTROL_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "CurrentHue", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentSaturation", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "RemainingTime", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentX", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x616B", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentY", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x607D", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "DriftCompensation", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CompensationText", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorTemperatureMireds", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00FA", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorMode", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x01", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Options", + "code": 15, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "NumberOfPrimaries", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary1X", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary1Y", + "code": 18, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary1Intensity", + "code": 19, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary2X", + "code": 21, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary2Y", + "code": 22, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary2Intensity", + "code": 23, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary3X", + "code": 25, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary3Y", + "code": 26, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary3Intensity", + "code": 27, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary4X", + "code": 32, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary4Y", + "code": 33, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary4Intensity", + "code": 34, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary5X", + "code": 36, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary5Y", + "code": 37, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary5Intensity", + "code": 38, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary6X", + "code": 40, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary6Y", + "code": 41, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Primary6Intensity", + "code": 42, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "WhitePointX", + "code": 48, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "WhitePointY", + "code": 49, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorPointRX", + "code": 50, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorPointRY", + "code": 51, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorPointRIntensity", + "code": 52, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorPointGX", + "code": 54, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorPointGY", + "code": 55, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorPointGIntensity", + "code": 56, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorPointBX", + "code": 58, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorPointBY", + "code": 59, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorPointBIntensity", + "code": 60, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EnhancedCurrentHue", + "code": 16384, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EnhancedColorMode", + "code": 16385, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x01", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorLoopActive", + "code": 16386, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorLoopDirection", + "code": 16387, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorLoopTime", + "code": 16388, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0019", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorLoopStartEnhancedHue", + "code": 16389, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x2300", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorLoopStoredEnhancedHue", + "code": 16390, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorCapabilities", + "code": 16394, + "mfgCode": null, + "side": "server", + "type": "bitmap16", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorTempPhysicalMinMireds", + "code": 16395, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ColorTempPhysicalMaxMireds", + "code": 16396, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0xFEFF", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CoupleColorTempToLevelMinMireds", + "code": 16397, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "StartUpColorTemperatureMireds", + "code": 16400, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Illuminance Measurement", + "code": 1024, + "mfgCode": null, + "define": "ILLUMINANCE_MEASUREMENT_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Illuminance Measurement", + "code": 1024, + "mfgCode": null, + "define": "ILLUMINANCE_MEASUREMENT_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "MeasuredValue", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MinMeasuredValue", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MaxMeasuredValue", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Tolerance", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LightSensorType", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0xFF", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Temperature Measurement", + "code": 1026, + "mfgCode": null, + "define": "TEMPERATURE_MEASUREMENT_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Temperature Measurement", + "code": 1026, + "mfgCode": null, + "define": "TEMPERATURE_MEASUREMENT_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "MeasuredValue", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MinMeasuredValue", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x8000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MaxMeasuredValue", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x8000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Tolerance", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Relative Humidity Measurement", + "code": 1029, + "mfgCode": null, + "define": "RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Relative Humidity Measurement", + "code": 1029, + "mfgCode": null, + "define": "RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "MeasuredValue", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MinMeasuredValue", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MaxMeasuredValue", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Tolerance", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Occupancy Sensing", + "code": 1030, + "mfgCode": null, + "define": "OCCUPANCY_SENSING_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Occupancy Sensing", + "code": 1030, + "mfgCode": null, + "define": "OCCUPANCY_SENSING_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "Occupancy", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "OccupancyBitmap", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OccupancySensorType", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "OccupancySensorTypeEnum", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OccupancySensorTypeBitmap", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "OccupancySensorTypeBitmap", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PIROccupiedToUnoccupiedDelay", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PIRUnoccupiedToOccupiedDelay", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PIRUnoccupiedToOccupiedThreshold", + "code": 18, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x01", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "UltrasonicOccupiedToUnoccupiedDelay", + "code": 32, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "UltrasonicUnoccupiedToOccupiedDelay", + "code": 33, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "UltrasonicUnoccupiedToOccupiedThreshold", + "code": 34, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x01", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PhysicalContactOccupiedToUnoccupiedDelay", + "code": 48, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PhysicalContactUnoccupiedToOccupiedDelay", + "code": 49, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PhysicalContactUnoccupiedToOccupiedThreshold", + "code": 50, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x01", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Wake on LAN", + "code": 1283, + "mfgCode": null, + "define": "WAKE_ON_LAN_CLUSTER", + "side": "client", + "enabled": 0, + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Wake on LAN", + "code": 1283, + "mfgCode": null, + "define": "WAKE_ON_LAN_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "MACAddress", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Channel", + "code": 1284, + "mfgCode": null, + "define": "CHANNEL_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "ChangeChannel", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ChangeChannelByNumber", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "SkipChannel", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Channel", + "code": 1284, + "mfgCode": null, + "define": "CHANNEL_CLUSTER", + "side": "server", + "enabled": 0, + "commands": [ + { + "name": "ChangeChannelResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ChannelList", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Lineup", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "LineupInfoStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CurrentChannel", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "ChannelInfoStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Target Navigator", + "code": 1285, + "mfgCode": null, + "define": "TARGET_NAVIGATOR_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "NavigateTarget", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Target Navigator", + "code": 1285, + "mfgCode": null, + "define": "TARGET_NAVIGATOR_CLUSTER", + "side": "server", + "enabled": 0, + "commands": [ + { + "name": "NavigateTargetResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "TargetList", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CurrentTarget", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Media Playback", + "code": 1286, + "mfgCode": null, + "define": "MEDIA_PLAYBACK_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "Play", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "Pause", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "Stop", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "StartOver", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "Previous", + "code": 4, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "Next", + "code": 5, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "Rewind", + "code": 6, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "FastForward", + "code": 7, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "SkipForward", + "code": 8, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "SkipBackward", + "code": 9, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "Seek", + "code": 11, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ] + }, + { + "name": "Media Playback", + "code": 1286, + "mfgCode": null, + "define": "MEDIA_PLAYBACK_CLUSTER", + "side": "server", + "enabled": 0, + "commands": [ + { + "name": "PlaybackResponse", + "code": 10, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "CurrentState", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "PlaybackStateEnum", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "StartTime", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "epoch_us", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0xFF", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Duration", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SampledPosition", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "PlaybackPositionStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PlaybackSpeed", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "single", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SeekRangeEnd", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SeekRangeStart", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Media Input", + "code": 1287, + "mfgCode": null, + "define": "MEDIA_INPUT_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "SelectInput", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ShowInputStatus", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "HideInputStatus", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "RenameInput", + "code": 3, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Media Input", + "code": 1287, + "mfgCode": null, + "define": "MEDIA_INPUT_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "InputList", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CurrentInput", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Low Power", + "code": 1288, + "mfgCode": null, + "define": "LOW_POWER_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "Sleep", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Low Power", + "code": 1288, + "mfgCode": null, + "define": "LOW_POWER_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Keypad Input", + "code": 1289, + "mfgCode": null, + "define": "KEYPAD_INPUT_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "SendKey", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Keypad Input", + "code": 1289, + "mfgCode": null, + "define": "KEYPAD_INPUT_CLUSTER", + "side": "server", + "enabled": 0, + "commands": [ + { + "name": "SendKeyResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Content Launcher", + "code": 1290, + "mfgCode": null, + "define": "CONTENT_LAUNCHER_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "LaunchContent", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "LaunchURL", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Content Launcher", + "code": 1290, + "mfgCode": null, + "define": "CONTENT_LAUNCHER_CLUSTER", + "side": "server", + "enabled": 0, + "commands": [ + { + "name": "LauncherResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "AcceptHeader", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SupportedStreamingProtocols", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Application Launcher", + "code": 1292, + "mfgCode": null, + "define": "APPLICATION_LAUNCHER_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "LaunchApp", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "StopApp", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "HideApp", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Application Launcher", + "code": 1292, + "mfgCode": null, + "define": "APPLICATION_LAUNCHER_CLUSTER", + "side": "server", + "enabled": 0, + "commands": [ + { + "name": "LauncherResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "CatalogList", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CurrentApp", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "ApplicationEPStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Application Basic", + "code": 1293, + "mfgCode": null, + "define": "APPLICATION_BASIC_CLUSTER", + "side": "client", + "enabled": 0 + }, + { + "name": "Application Basic", + "code": 1293, + "mfgCode": null, + "define": "APPLICATION_BASIC_CLUSTER", + "side": "server", + "enabled": 0, + "attributes": [ + { + "name": "VendorName", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "VendorID", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "vendor_id", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ApplicationName", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ProductID", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Application", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "ApplicationStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Status", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "ApplicationStatusEnum", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ApplicationVersion", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AllowedVendorList", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + } + ] + } + ], + "endpoints": [ + { + "endpointTypeName": "MA-rootdevice", + "endpointTypeIndex": 0, + "profileId": 259, + "endpointId": 0, + "networkId": 0, + "endpointVersion": 1, + "deviceIdentifier": 22 + }, + { + "endpointTypeName": "MA-videoplayer", + "endpointTypeIndex": 1, + "profileId": 259, + "endpointId": 1, + "networkId": 0, + "endpointVersion": 1, + "deviceIdentifier": 256 + } + ], + "log": [] +} \ No newline at end of file diff --git a/scripts/build/build/targets.py b/scripts/build/build/targets.py index 91bf326e2933e2..d3b8d256e1cf44 100755 --- a/scripts/build/build/targets.py +++ b/scripts/build/build/targets.py @@ -328,6 +328,7 @@ def BuildAndroidTarget(): TargetPart('tv-casting-app', app=AndroidApp.TV_CASTING_APP), TargetPart('java-matter-controller', app=AndroidApp.JAVA_MATTER_CONTROLLER), + TargetPart('st-device-app', app=AndroidApp.ST_DEVICE_APP), ]) # Modifiers diff --git a/scripts/build/builders/android.py b/scripts/build/builders/android.py index 3ae81c9f8e8b09..daa4cc15acfc37 100644 --- a/scripts/build/builders/android.py +++ b/scripts/build/builders/android.py @@ -71,6 +71,7 @@ class AndroidApp(Enum): TV_SERVER = auto() TV_CASTING_APP = auto() JAVA_MATTER_CONTROLLER = auto() + ST_DEVICE_APP = auto() def AppName(self): if self == AndroidApp.CHIP_TOOL: @@ -81,6 +82,8 @@ def AppName(self): return "tv-server" elif self == AndroidApp.TV_CASTING_APP: return "tv-casting" + elif self == AndroidApp.ST_DEVICE_APP: + return "st-device-app" else: raise Exception("Unknown app type: %r" % self) @@ -91,6 +94,8 @@ def AppGnArgs(self): gn_args["chip_config_network_layer_ble"] = False elif self == AndroidApp.TV_CASTING_APP: gn_args["chip_config_network_layer_ble"] = False + elif self == AndroidApp.ST_DEVICE_APP: + gn_args["chip_config_network_layer_ble"] = True return gn_args def ExampleName(self): @@ -98,6 +103,8 @@ def ExampleName(self): return "tv-app" elif self == AndroidApp.TV_CASTING_APP: return "tv-casting-app" + elif self == AndroidApp.ST_DEVICE_APP: + return "st-device-app" else: return None @@ -301,20 +308,35 @@ def gradlewBuildExampleAndroid(self): self.identifier, module), ) else: - self._Execute( - [ - "%s/examples/%s/android/App/gradlew" - % (self.root, self.app.ExampleName()), - "-p", - "%s/examples/%s/android/App/" % (self.root, - self.app.ExampleName()), - "-PmatterBuildSrcDir=%s" % self.output_dir, - "-PmatterSdkSourceBuild=false", - "-PbuildDir=%s" % self.output_dir, - "assembleDebug", - ], - title="Building Example " + self.identifier, - ) + if self.app.ExampleName() == "st-device-app": + self._Execute( + [ + "%s/examples/%s/android/App/gradlew" + % (self.root, self.app.ExampleName()), + "-p", + "%s/examples/%s/android/App/" % (self.root, + self.app.ExampleName()), + "-PmatterBuildSrcDir=%s" % self.output_dir, + "-PmatterSdkSourceBuild=false", + ":app:assembleDebug", + ], + title="Building Example " + self.identifier, + ) + else: + self._Execute( + [ + "%s/examples/%s/android/App/gradlew" + % (self.root, self.app.ExampleName()), + "-p", + "%s/examples/%s/android/App/" % (self.root, + self.app.ExampleName()), + "-PmatterBuildSrcDir=%s" % self.output_dir, + "-PmatterSdkSourceBuild=false", + "-PbuildDir=%s" % self.output_dir, + "assembleDebug", + ], + title="Building Example " + self.identifier, + ) def generate(self): self._Execute( @@ -486,6 +508,46 @@ def _build(self): self.copyToExampleApp(jnilibs_dir, libs_dir, libs, jars) self.gradlewBuildExampleAndroid() + elif exampleName == "st-device-app": + jnilibs_dir = os.path.join( + self.root, + "examples/", + self.app.ExampleName(), + "android/App/app/libs/jniLibs", + self.board.AbiName(), + ) + + libs_dir = os.path.join( + self.root, "examples/", self.app.ExampleName(), "android/App/app/libs" + ) + + libs = ["libc++_shared.so", "libStDeviceApp.so"] + + jars = { + "OnboardingPayload.jar": "third_party/connectedhomeip/src/controller/java/OnboardingPayload.jar", + "AndroidPlatform.jar": "third_party/connectedhomeip/src/platform/android/AndroidPlatform.jar", + "CHIPAppServer.jar": "third_party/connectedhomeip/src/app/server/java/CHIPAppServer.jar", + "StDeviceApp.jar": "StDeviceApp.jar", + } + + self.copyToExampleApp(jnilibs_dir, libs_dir, libs, jars) + self.gradlewBuildExampleAndroid() + + output_dir = os.path.join( + self.output_dir, "outputs", "apk" + ) + + self._Execute( + ["mkdir", "-p", output_dir], title="Prepare outputs directory" + ) + + apk_dir = os.path.join( + self.root, "examples", self.app.ExampleName(), "android/App/app/build/outputs/apk/debug" + ) + + self._Execute( + ["cp", "-f", "-r", apk_dir, output_dir], title="Copying outputs" + ) if (self.profile != AndroidProfile.DEBUG): self.stripSymbols() From bf03bba9942ed3d2b31071831868737830404937 Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Fri, 7 Jul 2023 20:36:22 +0900 Subject: [PATCH 02/36] st-device-app: Add gradle-wrapper.jar file Signed-off-by: Jaehoon You Signed-off-by: chulspro.kim@samsung.com --- .../App/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/st-device-app/android/App/gradle/wrapper/gradle-wrapper.jar diff --git a/examples/st-device-app/android/App/gradle/wrapper/gradle-wrapper.jar b/examples/st-device-app/android/App/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 zcma&O1CT9Y(k9%tZQHhO+qUh#ZQHhO+qmuS+qP|E@9xZO?0h@l{(r>DQ>P;GjjD{w zH}lENr;dU&FbEU?00aa80D$0M0RRB{U*7-#kbjS|qAG&4l5%47zyJ#WrfA#1$1Ctx zf&Z_d{GW=lf^w2#qRJ|CvSJUi(^E3iv~=^Z(zH}F)3Z%V3`@+rNB7gTVU{Bb~90p|f+0(v;nz01EG7yDMX9@S~__vVgv%rS$+?IH+oZ03D5zYrv|^ zC1J)SruYHmCki$jLBlTaE5&dFG9-kq3!^i>^UQL`%gn6)jz54$WDmeYdsBE9;PqZ_ zoGd=P4+|(-u4U1dbAVQrFWoNgNd;0nrghPFbQrJctO>nwDdI`Q^i0XJDUYm|T|RWc zZ3^Qgo_Qk$%Fvjj-G}1NB#ZJqIkh;kX%V{THPqOyiq)d)0+(r9o(qKlSp*hmK#iIY zA^)Vr$-Hz<#SF=0@tL@;dCQsm`V9s1vYNq}K1B)!XSK?=I1)tX+bUV52$YQu*0%fnWEukW>mxkz+%3-S!oguE8u#MGzST8_Dy^#U?fA@S#K$S@9msUiX!gd_ow>08w5)nX{-KxqMOo7d?k2&?Vf z&diGDtZr(0cwPe9z9FAUSD9KC)7(n^lMWuayCfxzy8EZsns%OEblHFSzP=cL6}?J| z0U$H!4S_TVjj<`6dy^2j`V`)mC;cB%* z8{>_%E1^FH!*{>4a7*C1v>~1*@TMcLK{7nEQ!_igZC}ikJ$*<$yHy>7)oy79A~#xE zWavoJOIOC$5b6*q*F_qN1>2#MY)AXVyr$6x4b=$x^*aqF*L?vmj>Mgv+|ITnw_BoW zO?jwHvNy^prH{9$rrik1#fhyU^MpFqF2fYEt(;4`Q&XWOGDH8k6M=%@fics4ajI;st# zCU^r1CK&|jzUhRMv;+W~6N;u<;#DI6cCw-otsc@IsN3MoSD^O`eNflIoR~l4*&-%RBYk@gb^|-JXs&~KuSEmMxB}xSb z@K76cXD=Y|=I&SNC2E+>Zg?R6E%DGCH5J1nU!A|@eX9oS(WPaMm==k2s_ueCqdZw| z&hqHp)47`c{BgwgvY2{xz%OIkY1xDwkw!<0veB#yF4ZKJyabhyyVS`gZepcFIk%e2 zTcrmt2@-8`7i-@5Nz>oQWFuMC_KlroCl(PLSodswHqJ3fn<;gxg9=}~3x_L3P`9Sn zChIf}8vCHvTriz~T2~FamRi?rh?>3bX1j}%bLH+uFX+p&+^aXbOK7clZxdU~6Uxgy z8R=obwO4dL%pmVo*Ktf=lH6hnlz_5k3cG;m8lgaPp~?eD!Yn2kf)tU6PF{kLyn|oI@eQ`F z3IF7~Blqg8-uwUuWZScRKn%c2_}dXB6Dx_&xR*n9M9LXasJhtZdr$vBY!rP{c@=)& z#!?L$2UrkvClwQO>U*fSMs67oSj2mxiJ$t;E|>q%Kh_GzzWWO&3;ufU%2z%ucBU8H z3WIwr$n)cfCXR&>tyB7BcSInK>=ByZA%;cVEJhcg<#6N{aZC4>K41XF>ZgjG`z_u& zGY?;Ad?-sgiOnI`oppF1o1Gurqbi*;#x2>+SSV6|1^G@ooVy@fg?wyf@0Y!UZ4!}nGuLeC^l)6pwkh|oRY`s1Pm$>zZ3u-83T|9 zGaKJIV3_x+u1>cRibsaJpJqhcm%?0-L;2 zitBrdRxNmb0OO2J%Y&Ym(6*`_P3&&5Bw157{o7LFguvxC$4&zTy#U=W*l&(Q2MNO} zfaUwYm{XtILD$3864IA_nn34oVa_g^FRuHL5wdUd)+W-p-iWCKe8m_cMHk+=? zeKX)M?Dt(|{r5t7IenkAXo%&EXIb-i^w+0CX0D=xApC=|Xy(`xy+QG^UyFe z+#J6h_&T5i#sV)hj3D4WN%z;2+jJcZxcI3*CHXGmOF3^)JD5j&wfX)e?-|V0GPuA+ zQFot%aEqGNJJHn$!_}#PaAvQ^{3-Ye7b}rWwrUmX53(|~i0v{}G_sI9uDch_brX&6 zWl5Ndj-AYg(W9CGfQf<6!YmY>Ey)+uYd_JNXH=>|`OH-CDCmcH(0%iD_aLlNHKH z7bcW-^5+QV$jK?R*)wZ>r9t}loM@XN&M-Pw=F#xn(;u3!(3SXXY^@=aoj70;_=QE9 zGghsG3ekq#N||u{4We_25U=y#T*S{4I{++Ku)> zQ!DZW;pVcn>b;&g2;YE#+V`v*Bl&Y-i@X6D*OpNA{G@JAXho&aOk(_j^weW{#3X5Y z%$q_wpb07EYPdmyH(1^09i$ca{O<}7) zRWncXdSPgBE%BM#by!E>tdnc$8RwUJg1*x($6$}ae$e9Knj8gvVZe#bLi!<+&BkFj zg@nOpDneyc+hU9P-;jmOSMN|*H#>^Ez#?;%C3hg_65leSUm;iz)UkW)jX#p)e&S&M z1|a?wDzV5NVnlhRBCd_;F87wp>6c<&nkgvC+!@KGiIqWY4l}=&1w7|r6{oBN8xyzh zG$b#2=RJp_iq6)#t5%yLkKx(0@D=C3w+oiXtSuaQ%I1WIb-eiE$d~!)b@|4XLy!CZ z9p=t=%3ad@Ep+<9003D2KZ5VyP~_n$=;~r&YUg5UZ0KVD&tR1DHy9x)qWtKJp#Kq# zP*8p#W(8JJ_*h_3W}FlvRam?<4Z+-H77^$Lvi+#vmhL9J zJ<1SV45xi;SrO2f=-OB(7#iNA5)x1uNC-yNxUw|!00vcW2PufRm>e~toH;M0Q85MQLWd?3O{i8H+5VkR@l9Dg-ma ze2fZ%>G(u5(k9EHj2L6!;(KZ8%8|*-1V|B#EagbF(rc+5iL_5;Eu)L4Z-V;0HfK4d z*{utLse_rvHZeQ>V5H=f78M3Ntg1BPxFCVD{HbNA6?9*^YIq;B-DJd{Ca2L#)qWP? zvX^NhFmX?CTWw&Ns}lgs;r3i+Bq@y}Ul+U%pzOS0Fcv9~aB(0!>GT0)NO?p=25LjN z2bh>6RhgqD7bQj#k-KOm@JLgMa6>%-ok1WpOe)FS^XOU{c?d5shG(lIn3GiVBxmg`u%-j=)^v&pX1JecJics3&jvPI)mDut52? z3jEA)DM%}BYbxxKrizVYwq?(P&19EXlwD9^-6J+4!}9{ywR9Gk42jjAURAF&EO|~N z)?s>$Da@ikI4|^z0e{r`J8zIs>SpM~Vn^{3fArRu;?+43>lD+^XtUcY1HidJwnR6+ z!;oG2=B6Z_=M%*{z-RaHc(n|1RTKQdNjjV!Pn9lFt^4w|AeN06*j}ZyhqZ^!-=cyGP_ShV1rGxkx8t zB;8`h!S{LD%ot``700d0@Grql(DTt4Awgmi+Yr0@#jbe=2#UkK%rv=OLqF)9D7D1j z!~McAwMYkeaL$~kI~90)5vBhBzWYc3Cj1WI0RS`z000R8-@ET0dA~*r(gSiCJmQMN&4%1D zyVNf0?}sBH8zNbBLn>~(W{d3%@kL_eQ6jEcR{l>C|JK z(R-fA!z|TTRG40|zv}7E@PqCAXP3n`;%|SCQ|ZS%ym$I{`}t3KPL&^l5`3>yah4*6 zifO#{VNz3)?ZL$be;NEaAk9b#{tV?V7 zP|wf5YA*1;s<)9A4~l3BHzG&HH`1xNr#%){4xZ!jq%o=7nN*wMuXlFV{HaiQLJ`5G zBhDi#D(m`Q1pLh@Tq+L;OwuC52RdW7b8}~60WCOK5iYMUad9}7aWBuILb({5=z~YF zt?*Jr5NG+WadM{mDL>GyiByCuR)hd zA=HM?J6l1Xv0Dl+LW@w$OTcEoOda^nFCw*Sy^I@$sSuneMl{4ys)|RY#9&NxW4S)9 zq|%83IpslTLoz~&vTo!Ga@?rj_kw{|k{nv+w&Ku?fyk4Ki4I?);M|5Axm)t+BaE)D zm(`AQ#k^DWrjbuXoJf2{Aj^KT zFb1zMSqxq|vceV+Mf-)$oPflsO$@*A0n0Z!R{&(xh8s}=;t(lIy zv$S8x>m;vQNHuRzoaOo?eiWFe{0;$s`Bc+Osz~}Van${u;g(su`3lJ^TEfo~nERfP z)?aFzpDgnLYiERsKPu|0tq4l2wT)Atr6Qb%m-AUn6HnCue*yWICp7TjW$@sO zm5rm4aTcPQ(rfi7a`xP7cKCFrJD}*&_~xgLyr^-bmsL}y;A5P|al8J3WUoBSjqu%v zxC;mK!g(7r6RRJ852Z~feoC&sD3(6}^5-uLK8o)9{8L_%%rItZK9C){UxB|;G>JbP zsRRtS4-3B*5c+K2kvmgZK8472%l>3cntWUOVHxB|{Ay~aOg5RN;{PJgeVD*H%ac+y!h#wi%o2bF2Ca8IyMyH{>4#{E_8u^@+l-+n=V}Sq?$O z{091@v%Bd*3pk0^2UtiF9Z+(a@wy6 zUdw8J*ze$K#=$48IBi1U%;hmhO>lu!uU;+RS}p&6@rQila7WftH->*A4=5W|Fmtze z)7E}jh@cbmr9iup^i%*(uF%LG&!+Fyl@LFA-}Ca#bxRfDJAiR2dt6644TaYw1Ma79 zt8&DYj31j^5WPNf5P&{)J?WlCe@<3u^78wnd(Ja4^a>{^Tw}W>|Cjt^If|7l^l)^Q zbz|7~CF(k_9~n|h;ysZ+jHzkXf(*O*@5m zLzUmbHp=x!Q|!9NVXyipZ3)^GuIG$k;D)EK!a5=8MFLI_lpf`HPKl=-Ww%z8H_0$j ztJ||IfFG1lE9nmQ0+jPQy zCBdKkjArH@K7jVcMNz);Q(Q^R{d5G?-kk;Uu_IXSyWB)~KGIizZL(^&qF;|1PI7!E zTP`%l)gpX|OFn&)M%txpQ2F!hdA~hX1Cm5)IrdljqzRg!f{mN%G~H1&oqe`5eJCIF zHdD7O;AX-{XEV(a`gBFJ9ews#CVS2y!&>Cm_dm3C8*n3MA*e67(WC?uP@8TXuMroq z{#w$%z@CBIkRM7?}Xib+>hRjy?%G!fiw8! z8(gB+8J~KOU}yO7UGm&1g_MDJ$IXS!`+*b*QW2x)9>K~Y*E&bYMnjl6h!{17_8d!%&9D`a7r&LKZjC<&XOvTRaKJ1 zUY@hl5^R&kZl3lU3njk`3dPzxj$2foOL26r(9zsVF3n_F#v)s5vv3@dgs|lP#eylq62{<-vczqP!RpVBTgI>@O6&sU>W|do17+#OzQ7o5A$ICH z?GqwqnK^n2%LR;$^oZM;)+>$X3s2n}2jZ7CdWIW0lnGK-b#EG01)P@aU`pg}th&J-TrU`tIpb5t((0eu|!u zQz+3ZiOQ^?RxxK4;zs=l8q!-n7X{@jSwK(iqNFiRColuEOg}!7cyZi`iBX4g1pNBj zAPzL?P^Ljhn;1$r8?bc=#n|Ed7wB&oHcw()&*k#SS#h}jO?ZB246EGItsz*;^&tzp zu^YJ0=lwsi`eP_pU8}6JA7MS;9pfD;DsSsLo~ogzMNP70@@;Fm8f0^;>$Z>~}GWRw!W5J3tNX*^2+1f3hz{~rIzJo z6W%J(H!g-eI_J1>0juX$X4Cl6i+3wbc~k146UIX&G22}WE>0ga#WLsn9tY(&29zBvH1$`iWtTe zG2jYl@P!P)eb<5DsR72BdI7-zP&cZNI{7q3e@?N8IKc4DE#UVr->|-ryuJXk^u^>4 z$3wE~=q390;XuOQP~TNoDR?#|NSPJ%sTMInA6*rJ%go|=YjGe!B>z6u$IhgQSwoV* zjy3F2#I>uK{42{&IqP59)Y(1*Z>>#W8rCf4_eVsH)`v!P#^;BgzKDR`ARGEZzkNX+ zJUQu=*-ol=Xqqt5=`=pA@BIn@6a9G8C{c&`i^(i+BxQO9?YZ3iu%$$da&Kb?2kCCo zo7t$UpSFWqmydXf@l3bVJ=%K?SSw)|?srhJ-1ZdFu*5QhL$~-IQS!K1s@XzAtv6*Y zl8@(5BlWYLt1yAWy?rMD&bwze8bC3-GfNH=p zynNFCdxyX?K&G(ZZ)afguQ2|r;XoV^=^(;Cku#qYn4Lus`UeKt6rAlFo_rU`|Rq z&G?~iWMBio<78of-2X(ZYHx~=U0Vz4btyXkctMKdc9UM!vYr~B-(>)(Hc|D zMzkN4!PBg%tZoh+=Gba!0++d193gbMk2&krfDgcbx0jI92cq?FFESVg0D$>F+bil} zY~$)|>1HZsX=5sAZ2WgPB5P=8X#TI+NQ(M~GqyVB53c6IdX=k>Wu@A0Svf5#?uHaF zsYn|koIi3$(%GZ2+G+7Fv^lHTb#5b8sAHSTnL^qWZLM<(1|9|QFw9pnRU{svj}_Al zL)b9>fN{QiA($8peNEJyy`(a{&uh-T4_kdZFIVsKKVM(?05}76EEz?#W za^fiZOAd14IJ4zLX-n7Lq0qlQ^lW8Cvz4UKkV9~P}>sq0?xD3vg+$4vLm~C(+ zM{-3Z#qnZ09bJ>}j?6ry^h+@PfaD7*jZxBEY4)UG&daWb??6)TP+|3#Z&?GL?1i+280CFsE|vIXQbm| zM}Pk!U`U5NsNbyKzkrul-DzwB{X?n3E6?TUHr{M&+R*2%yOiXdW-_2Yd6?38M9Vy^ z*lE%gA{wwoSR~vN0=no}tP2Ul5Gk5M(Xq`$nw#ndFk`tcpd5A=Idue`XZ!FS>Q zG^0w#>P4pPG+*NC9gLP4x2m=cKP}YuS!l^?sHSFftZy{4CoQrb_ z^20(NnG`wAhMI=eq)SsIE~&Gp9Ne0nD4%Xiu|0Fj1UFk?6avDqjdXz{O1nKao*46y zT8~iA%Exu=G#{x=KD;_C&M+Zx4+n`sHT>^>=-1YM;H<72k>$py1?F3#T1*ef9mLZw z5naLQr?n7K;2l+{_uIw*_1nsTn~I|kkCgrn;|G~##hM;9l7Jy$yJfmk+&}W@JeKcF zx@@Woiz8qdi|D%aH3XTx5*wDlbs?dC1_nrFpm^QbG@wM=i2?Zg;$VK!c^Dp8<}BTI zyRhAq@#%2pGV49*Y5_mV4+OICP|%I(dQ7x=6Ob}>EjnB_-_18*xrY?b%-yEDT(wrO z9RY2QT0`_OpGfMObKHV;QLVnrK%mc?$WAdIT`kJQT^n%GuzE7|9@k3ci5fYOh(287 zuIbg!GB3xLg$YN=n)^pHGB0jH+_iIiC=nUcD;G6LuJsjn2VI1cyZx=a?ShCsF==QK z;q~*m&}L<-cb+mDDXzvvrRsybcgQ;Vg21P(uLv5I+eGc7o7tc6`;OA9{soHFOz zT~2?>Ts}gprIX$wRBb4yE>ot<8+*Bv`qbSDv*VtRi|cyWS>)Fjs>fkNOH-+PX&4(~ z&)T8Zam2L6puQl?;5zg9h<}k4#|yH9czHw;1jw-pwBM*O2hUR6yvHATrI%^mvs9q_ z&ccT0>f#eDG<^WG^q@oVqlJrhxH)dcq2cty@l3~|5#UDdExyXUmLQ}f4#;6fI{f^t zDCsgIJ~0`af%YR%Ma5VQq-p21k`vaBu6WE?66+5=XUd%Ay%D$irN>5LhluRWt7 zov-=f>QbMk*G##&DTQyou$s7UqjjW@k6=!I@!k+S{pP8R(2=e@io;N8E`EOB;OGoI zw6Q+{X1_I{OO0HPpBz!X!@`5YQ2)t{+!?M_iH25X(d~-Zx~cXnS9z>u?+If|iNJbx zyFU2d1!ITX64D|lE0Z{dLRqL1Ajj=CCMfC4lD3&mYR_R_VZ>_7_~|<^o*%_&jevU+ zQ4|qzci=0}Jydw|LXLCrOl1_P6Xf@c0$ieK2^7@A9UbF{@V_0p%lqW|L?5k>bVM8|p5v&2g;~r>B8uo<4N+`B zH{J)h;SYiIVx@#jI&p-v3dwL5QNV1oxPr8J%ooezTnLW>i*3Isb49%5i!&ac_dEXv zvXmVUck^QHmyrF8>CGXijC_R-y(Qr{3Zt~EmW)-nC!tiH`wlw5D*W7Pip;T?&j%kX z6DkZX4&}iw>hE(boLyjOoupf6JpvBG8}jIh!!VhnD0>}KSMMo{1#uU6kiFcA04~|7 zVO8eI&x1`g4CZ<2cYUI(n#wz2MtVFHx47yE5eL~8bot~>EHbevSt}LLMQX?odD{Ux zJMnam{d)W4da{l7&y-JrgiU~qY3$~}_F#G7|MxT)e;G{U`In&?`j<5D->}cb{}{T(4DF0BOk-=1195KB-E*o@c?`>y#4=dMtYtSY=&L{!TAjFVcq0y@AH`vH! z$41+u!Ld&}F^COPgL(EE{0X7LY&%D7-(?!kjFF7=qw<;`V{nwWBq<)1QiGJgUc^Vz ztMUlq1bZqKn17|6x6iAHbWc~l1HcmAxr%$Puv!znW)!JiukwIrqQ00|H$Z)OmGG@= zv%A8*4cq}(?qn4rN6o`$Y))(MyXr8R<2S^J+v(wmFmtac!%VOfN?&(8Nr!T@kV`N; z*Q33V3t`^rN&aBiHet)18wy{*wi1=W!B%B-Q6}SCrUl$~Hl{@!95ydml@FK8P=u4s z4e*7gV2s=YxEvskw2Ju!2%{8h01rx-3`NCPc(O zH&J0VH5etNB2KY6k4R@2Wvl^Ck$MoR3=)|SEclT2ccJ!RI9Nuter7u9@;sWf-%um;GfI!=eEIQ2l2p_YWUd{|6EG ze{yO6;lMc>;2tPrsNdi@&1K6(1;|$xe8vLgiouj%QD%gYk`4p{Ktv9|j+!OF-P?@p z;}SV|oIK)iwlBs+`ROXkhd&NK zzo__r!B>tOXpBJMDcv!Mq54P+n4(@dijL^EpO1wdg~q+!DT3lB<>9AANSe!T1XgC=J^)IP0XEZ()_vpu!!3HQyJhwh?r`Ae%Yr~b% zO*NY9t9#qWa@GCPYOF9aron7thfWT`eujS4`t2uG6)~JRTI;f(ZuoRQwjZjp5Pg34 z)rp$)Kr?R+KdJ;IO;pM{$6|2y=k_siqvp%)2||cHTe|b5Ht8&A{wazGNca zX$Ol?H)E_R@SDi~4{d-|8nGFhZPW;Cts1;08TwUvLLv&_2$O6Vt=M)X;g%HUr$&06 zISZb(6)Q3%?;3r~*3~USIg=HcJhFtHhIV(siOwV&QkQe#J%H9&E21!C*d@ln3E@J* zVqRO^<)V^ky-R|%{(9`l-(JXq9J)1r$`uQ8a}$vr9E^nNiI*thK8=&UZ0dsFN_eSl z(q~lnD?EymWLsNa3|1{CRPW60>DSkY9YQ;$4o3W7Ms&@&lv9eH!tk~N&dhqX&>K@} zi1g~GqglxkZ5pEFkllJ)Ta1I^c&Bt6#r(QLQ02yHTaJB~- zCcE=5tmi`UA>@P=1LBfBiqk)HB4t8D?02;9eXj~kVPwv?m{5&!&TFYhu>3=_ zsGmYZ^mo*-j69-42y&Jj0cBLLEulNRZ9vXE)8~mt9C#;tZs;=#M=1*hebkS;7(aGf zcs7zH(I8Eui9UU4L--))yy`&d&$In&VA2?DAEss4LAPCLd>-$i?lpXvn!gu^JJ$(DoUlc6wE98VLZ*z`QGQov5l4Fm_h?V-;mHLYDVOwKz7>e4+%AzeO>P6v}ndPW| zM>m#6Tnp7K?0mbK=>gV}=@k*0Mr_PVAgGMu$j+pWxzq4MAa&jpCDU&-5eH27Iz>m^ zax1?*HhG%pJ((tkR(V(O(L%7v7L%!_X->IjS3H5kuXQT2!ow(;%FDE>16&3r){!ex zhf==oJ!}YU89C9@mfDq!P3S4yx$aGB?rbtVH?sHpg?J5C->!_FHM%Hl3#D4eplxzQ zRA+<@LD%LKSkTk2NyWCg7u=$%F#;SIL44~S_OGR}JqX}X+=bc@swpiClB`Zbz|f!4 z7Ysah7OkR8liXfI`}IIwtEoL}(URrGe;IM8%{>b1SsqXh)~w}P>yiFRaE>}rEnNkT z!HXZUtxUp1NmFm)Dm@-{FI^aRQqpSkz}ZSyKR%Y}YHNzBk)ZIp} zMtS=aMvkgWKm9&oTcU0?S|L~CDqA+sHpOxwnswF-fEG)cXCzUR?ps@tZa$=O)=L+5 zf%m58cq8g_o}3?Bhh+c!w4(7AjxwQ3>WnVi<{{38g7yFboo>q|+7qs<$8CPXUFAN< zG&}BHbbyQ5n|qqSr?U~GY{@GJ{(Jny{bMaOG{|IkUj7tj^9pa9|FB_<+KHLxSxR;@ zHpS$4V)PP+tx}22fWx(Ku9y+}Ap;VZqD0AZW4gCDTPCG=zgJmF{|x;(rvdM|2|9a}cex6xrMkERnkE;}jvU-kmzd%_J50$M`lIPCKf+^*zL=@LW`1SaEc%=m zQ+lT06Gw+wVwvQ9fZ~#qd430v2HndFsBa9WjD0P}K(rZYdAt^5WQIvb%D^Q|pkVE^ zte$&#~zmULFACGfS#g=2OLOnIf2Of-k!(BIHjs77nr!5Q1*I9 z1%?=~#Oss!rV~?-6Gm~BWJiA4mJ5TY&iPm_$)H1_rTltuU1F3I(qTQ^U$S>%$l z)Wx1}R?ij0idp@8w-p!Oz{&*W;v*IA;JFHA9%nUvVDy7Q8woheC#|8QuDZb-L_5@R zOqHwrh|mVL9b=+$nJxM`3eE{O$sCt$UK^2@L$R(r^-_+z?lOo+me-VW=Zw z-Bn>$4ovfWd%SPY`ab-u9{INc*k2h+yH%toDHIyqQ zO68=u`N}RIIs7lsn1D){)~%>ByF<>i@qFb<-axvu(Z+6t7v<^z&gm9McRB~BIaDn$ z#xSGT!rzgad8o>~kyj#h1?7g96tOcCJniQ+*#=b7wPio>|6a1Z?_(TS{)KrPe}(8j z!#&A=k(&Pj^F;r)CI=Z{LVu>uj!_W1q4b`N1}E(i%;BWjbEcnD=mv$FL$l?zS6bW!{$7j1GR5ocn94P2u{ z70tAAcpqtQo<@cXw~@i-@6B23;317|l~S>CB?hR5qJ%J3EFgyBdJd^fHZu7AzHF(BQ!tyAz^L0`X z23S4Fe{2X$W0$zu9gm%rg~A>ijaE#GlYlrF9$ds^QtaszE#4M(OLVP2O-;XdT(XIC zatwzF*)1c+t~c{L=fMG8Z=k5lv>U0;C{caN1NItnuSMp)6G3mbahu>E#sj&oy94KC zpH}8oEw{G@N3pvHhp{^-YaZeH;K+T_1AUv;IKD<=mv^&Ueegrb!yf`4VlRl$M?wsl zZyFol(2|_QM`e_2lYSABpKR{{NlxlDSYQNkS;J66aT#MSiTx~;tUmvs-b*CrR4w=f z8+0;*th6kfZ3|5!Icx3RV11sp=?`0Jy3Fs0N4GZQMN=8HmT6%x9@{Dza)k}UwL6JT zHRDh;%!XwXr6yuuy`4;Xsn0zlR$k%r%9abS1;_v?`HX_hI|+EibVnlyE@3aL5vhQq zlIG?tN^w@0(v9M*&L+{_+RQZw=o|&BRPGB>e5=ys7H`nc8nx)|-g;s7mRc7hg{GJC zAe^vCIJhajmm7C6g! zL&!WAQ~5d_5)00?w_*|*H>3$loHrvFbitw#WvLB!JASO?#5Ig5$Ys10n>e4|3d;tS zELJ0|R4n3Az(Fl3-r^QiV_C;)lQ1_CW{5bKS15U|E9?ZgLec@%kXr84>5jV2a5v=w z?pB1GPdxD$IQL4)G||B_lI+A=08MUFFR4MxfGOu07vfIm+j=z9tp~5i_6jb`tR>qV z$#`=BQ*jpCjm$F0+F)L%xRlnS%#&gro6PiRfu^l!EVan|r3y}AHJQOORGx4~ z&<)3=K-tx518DZyp%|!EqpU!+X3Et7n2AaC5(AtrkW>_57i}$eqs$rupubg0a1+WO zGHZKLN2L0D;ab%{_S1Plm|hx8R?O14*w*f&2&bB050n!R2by zw!@XOQx$SqZ5I<(Qu$V6g>o#A!JVwErWv#(Pjx=KeS0@hxr4?13zj#oWwPS(7Ro|v z>Mp@Kmxo79q|}!5qtX2-O@U&&@6s~!I&)1WQIl?lTnh6UdKT_1R640S4~f=_xoN3- zI+O)$R@RjV$F=>Ti7BlnG1-cFKCC(t|Qjm{SalS~V-tX#+2ekRhwmN zZr`8{QF6y~Z!D|{=1*2D-JUa<(1Z=;!Ei!KiRNH?o{p5o3crFF=_pX9O-YyJchr$~ zRC`+G+8kx~fD2k*ZIiiIGR<8r&M@3H?%JVOfE>)})7ScOd&?OjgAGT@WVNSCZ8N(p zuQG~76GE3%(%h1*vUXg$vH{ua0b`sQ4f0*y=u~lgyb^!#CcPJa2mkSEHGLsnO^kb$ zru5_l#nu=Y{rSMWiYx?nO{8I!gH+?wEj~UM?IrG}E|bRIBUM>UlY<`T1EHpRr36vv zBi&dG8oxS|J$!zoaq{+JpJy+O^W(nt*|#g32bd&K^w-t>!Vu9N!k9eA8r!Xc{utY> zg9aZ(D2E0gL#W0MdjwES-7~Wa8iubPrd?8-$C4BP?*wok&O8+ykOx{P=Izx+G~hM8 z*9?BYz!T8~dzcZr#ux8kS7u7r@A#DogBH8km8Ry4slyie^n|GrTbO|cLhpqgMdsjX zJ_LdmM#I&4LqqsOUIXK8gW;V0B(7^$y#h3h>J0k^WJfAMeYek%Y-Dcb_+0zPJez!GM zAmJ1u;*rK=FNM0Nf}Y!!P9c4)HIkMnq^b;JFd!S3?_Qi2G#LIQ)TF|iHl~WKK6JmK zbv7rPE6VkYr_%_BT}CK8h=?%pk@3cz(UrZ{@h40%XgThP*-Oeo`T0eq9 zA8BnWZKzCy5e&&_GEsU4*;_k}(8l_&al5K-V*BFM=O~;MgRkYsOs%9eOY6s6AtE*<7GQAR2ulC3RAJrG_P1iQK5Z~&B z&f8X<>yJV6)oDGIlS$Y*D^Rj(cszTy5c81a5IwBr`BtnC6_e`ArI8CaTX_%rx7;cn zR-0?J_LFg*?(#n~G8cXut(1nVF0Oka$A$1FGcERU<^ggx;p@CZc?3UB41RY+wLS`LWFNSs~YP zuw1@DNN3lTd|jDL7gjBsd9}wIw}4xT2+8dBQzI00m<@?c2L%>}QLfK5%r!a-iII`p zX@`VEUH)uj^$;7jVUYdADQ2k*!1O3WdfgF?OMtUXNpQ1}QINamBTKDuv19^{$`8A1 zeq%q*O0mi@(%sZU>Xdb0Ru96CFqk9-L3pzLVsMQ`Xpa~N6CR{9Rm2)A|CI21L(%GW zh&)Y$BNHa=FD+=mBw3{qTgw)j0b!Eahs!rZnpu)z!!E$*eXE~##yaXz`KE5(nQM`s zD!$vW9XH)iMxu9R>r$VlLk9oIR%HxpUiW=BK@4U)|1WNQ=mz9a z^!KkO=>GaJ!GBXm{KJj^;kh-MkUlEQ%lza`-G&}C5y1>La1sR6hT=d*NeCnuK%_LV zOXt$}iP6(YJKc9j-Fxq~*ItVUqljQ8?oaysB-EYtFQp9oxZ|5m0^Hq(qV!S+hq#g( z?|i*H2MIr^Kxgz+3vIljQ*Feejy6S4v~jKEPTF~Qhq!(ms5>NGtRgO5vfPPc4Z^AM zTj!`5xEreIN)vaNxa|q6qWdg>+T`Ol0Uz)ckXBXEGvPNEL3R8hB3=C5`@=SYgAju1 z!)UBr{2~=~xa{b8>x2@C7weRAEuatC)3pkRhT#pMPTpSbA|tan%U7NGMvzmF?c!V8 z=pEWxbdXbTAGtWTyI?Fml%lEr-^AE}w#l(<7OIw;ctw}imYax&vR4UYNJZK6P7ZOd zP87XfhnUHxCUHhM@b*NbTi#(-8|wcv%3BGNs#zRCVV(W?1Qj6^PPQa<{yaBwZ`+<`w|;rqUY_C z&AeyKwwf*q#OW-F()lir=T^<^wjK65Lif$puuU5+tk$;e_EJ;Lu+pH>=-8=PDhkBg z8cWt%@$Sc#C6F$Vd+0507;{OOyT7Hs%nKS88q-W!$f~9*WGBpHGgNp}=C*7!RiZ5s zn1L_DbKF@B8kwhDiLKRB@lsXVVLK|ph=w%_`#owlf@s@V(pa`GY$8h%;-#h@TsO|Y8V=n@*!Rog7<7Cid%apR|x zOjhHCyfbIt%+*PCveTEcuiDi%Wx;O;+K=W?OFUV%)%~6;gl?<0%)?snDDqIvkHF{ zyI02)+lI9ov42^hL>ZRrh*HhjF9B$A@=H94iaBESBF=eC_KT$8A@uB^6$~o?3Wm5t1OIaqF^~><2?4e3c&)@wKn9bD? zoeCs;H>b8DL^F&>Xw-xjZEUFFTv>JD^O#1E#)CMBaG4DX9bD(Wtc8Rzq}9soQ8`jf zeSnHOL}<+WVSKp4kkq&?SbETjq6yr@4%SAqOG=9E(3YeLG9dtV+8vmzq+6PFPk{L; z(&d++iu=^F%b+ea$i2UeTC{R*0Isk;vFK!no<;L+(`y`3&H-~VTdKROkdyowo1iqR zbVW(3`+(PQ2>TKY>N!jGmGo7oeoB8O|P_!Ic@ zZ^;3dnuXo;WJ?S+)%P>{Hcg!Jz#2SI(s&dY4QAy_vRlmOh)QHvs_7c&zkJCmJGVvV zX;Mtb>QE+xp`KyciG$Cn*0?AK%-a|=o!+7x&&yzHQOS>8=B*R=niSnta^Pxp1`=md z#;$pS$4WCT?mbiCYU?FcHGZ#)kHVJTTBt^%XE(Q};aaO=Zik0UgLcc0I(tUpt(>|& zcxB_|fxCF7>&~5eJ=Dpn&5Aj{A^cV^^}(7w#p;HG&Q)EaN~~EqrE1qKrMAc&WXIE;>@<&)5;gD2?={Xf@Mvn@OJKw=8Mgn z!JUFMwD+s==JpjhroT&d{$kQAy%+d`a*XxDEVxy3`NHzmITrE`o!;5ClXNPb4t*8P zzAivdr{j_v!=9!^?T3y?gzmqDWX6mkzhIzJ-3S{T5bcCFMr&RPDryMcdwbBuZbsgN zGrp@^i?rcfN7v0NKGzDPGE#4yszxu=I_`MI%Z|10nFjU-UjQXXA?k8Pk|OE<(?ae) zE%vG#eZAlj*E7_3dx#Zz4kMLj>H^;}33UAankJiDy5ZvEhrjr`!9eMD8COp}U*hP+ zF}KIYx@pkccIgyxFm#LNw~G&`;o&5)2`5aogs`1~7cMZQ7zj!%L4E`2yzlQN6REX20&O<9 zKV6fyr)TScJPPzNTC2gL+0x#=u>(({{D7j)c-%tvqls3#Y?Z1m zV5WUE)zdJ{$p>yX;^P!UcXP?UD~YM;IRa#Rs5~l+*$&nO(;Ers`G=0D!twR(0GF@c zHl9E5DQI}Oz74n zfKP>&$q0($T4y$6w(p=ERAFh+>n%iaeRA%!T%<^+pg?M)@ucY<&59$x9M#n+V&>}=nO9wCV{O~lg&v#+jcUj(tQ z`0u1YH)-`U$15a{pBkGyPL0THv1P|4e@pf@3IBZS4dVJPo#H>pWq%Lr0YS-SeWash z8R7=jb28KPMI|_lo#GEO|5B?N_e``H*23{~a!AmUJ+fb4HX-%QI@lSEUxKlGV7z7Q zSKw@-TR>@1RL%w{x}dW#k1NgW+q4yt2Xf1J62Bx*O^WG8OJ|FqI4&@d3_o8Id@*)4 zYrk=>@!wv~mh7YWv*bZhxqSmFh2Xq)o=m;%n$I?GSz49l1$xRpPu_^N(vZ>*>Z<04 z2+rP70oM=NDysd!@fQdM2OcyT?3T^Eb@lIC-UG=Bw{BjQ&P`KCv$AcJ;?`vdZ4){d z&gkoUK{$!$$K`3*O-jyM1~p-7T*qb)Ys>Myt^;#1&a%O@x8A+E>! zY8=eD`ZG)LVagDLBeHg>=atOG?Kr%h4B%E6m@J^C+U|y)XX@f z8oyJDW|9g=<#f<{JRr{y#~euMnv)`7j=%cHWLc}ngjq~7k**6%4u>Px&W%4D94(r* z+akunK}O0DC2A%Xo9jyF;DobX?!1I(7%}@7F>i%&nk*LMO)bMGg2N+1iqtg+r(70q zF5{Msgsm5GS7DT`kBsjMvOrkx&|EU!{{~gL4d2MWrAT=KBQ-^zQCUq{5PD1orxlIL zq;CvlWx#f1NWvh`hg011I%?T_s!e38l*lWVt|~z-PO4~~1g)SrJ|>*tXh=QfXT)%( z+ex+inPvD&O4Ur;JGz>$sUOnWdpSLcm1X%aQDw4{dB!cnj`^muI$CJ2%p&-kULVCE z>$eMR36kN$wCPR+OFDM3-U(VOrp9k3)lI&YVFqd;Kpz~K)@Fa&FRw}L(SoD z9B4a+hQzZT-BnVltst&=kq6Y(f^S4hIGNKYBgMxGJ^;2yrO}P3;r)(-I-CZ)26Y6? z&rzHI_1GCvGkgy-t1E;r^3Le30|%$ebDRu2+gdLG)r=A~Qz`}~&L@aGJ{}vVs_GE* zVUjFnzHiXfKQbpv&bR&}l2bzIjAooB)=-XNcYmrGmBh(&iu@o!^hn0^#}m2yZZUK8 zufVm7Gq0y`Mj;9b>`c?&PZkU0j4>IL=UL&-Lp3j&47B5pAW4JceG{!XCA)kT<%2nqCxj<)uy6XR_uws~>_MEKPOpAQ!H zkn>FKh)<9DwwS*|Y(q?$^N!6(51O0 z^JM~Ax{AI1Oj$fs-S5d4T7Z_i1?{%0SsIuQ&r8#(JA=2iLcTN+?>wOL532%&dMYkT z*T5xepC+V6zxhS@vNbMoi|i)=rpli@R9~P!39tWbSSb904ekv7D#quKbgFEMTb48P zuq(VJ+&L8aWU(_FCD$3^uD!YM%O^K(dvy~Wm2hUuh6bD|#(I39Xt>N1Y{ZqXL`Fg6 zKQ?T2htHN!(Bx;tV2bfTtIj7e)liN-29s1kew>v(D^@)#v;}C4-G=7x#;-dM4yRWm zyY`cS21ulzMK{PoaQ6xChEZ}o_#}X-o}<&0)$1#3we?+QeLt;aVCjeA)hn!}UaKt< zat1fHEx13y-rXNMvpUUmCVzocPmN~-Y4(YJvQ#db)4|%B!rBsgAe+*yor~}FrNH08 z3V!97S}D7d$zbSD{$z;@IYMxM6aHdypIuS*pr_U6;#Y!_?0i|&yU*@16l z*dcMqDQgfNBf}?quiu4e>H)yTVfsp#f+Du0@=Kc41QockXkCkvu>FBd6Q+@FL!(Yx z2`YuX#eMEiLEDhp+9uFqME_E^faV&~9qjBHJkIp~%$x^bN=N)K@kvSVEMdDuzA0sn z88CBG?`RX1@#hQNd`o^V{37)!w|nA)QfiYBE^m=yQKv-fQF+UCMcuEe1d4BH7$?>b zJl-r9@0^Ie=)guO1vOd=i$_4sz>y3x^R7n4ED!5oXL3@5**h(xr%Hv)_gILarO46q+MaDOF%ChaymKoI6JU5Pg;7#2n9-18|S1;AK+ zgsn6;k6-%!QD>D?cFy}8F;r@z8H9xN1jsOBw2vQONVqBVEbkiNUqgw~*!^##ht>w0 zUOykwH=$LwX2j&nLy=@{hr)2O&-wm-NyjW7n~Zs9UlH;P7iP3 zI}S(r0YFVYacnKH(+{*)Tbw)@;6>%=&Th=+Z6NHo_tR|JCI8TJiXv2N7ei7M^Q+RM z?9o`meH$5Yi;@9XaNR#jIK^&{N|DYNNbtdb)XW1Lv2k{E>;?F`#Pq|&_;gm~&~Zc9 zf+6ZE%{x4|{YdtE?a^gKyzr}dA>OxQv+pq|@IXL%WS0CiX!V zm$fCePA%lU{%pTKD7|5NJHeXg=I0jL@$tOF@K*MI$)f?om)D63K*M|r`gb9edD1~Y zc|w7N)Y%do7=0{RC|AziW7#am$)9jciRJ?IWl9PE{G3U+$%FcyKs_0Cgq`=K3@ttV z9g;M!3z~f_?P%y3-ph%vBMeS@p7P&Ea8M@97+%XEj*(1E6vHj==d zjsoviB>j^$_^OI_DEPvFkVo(BGRo%cJeD){6Uckei=~1}>sp299|IRjhXe)%?uP0I zF5+>?0#Ye}T^Y$u_rc4=lPcq4K^D(TZG-w30-YiEM=dcK+4#o*>lJ8&JLi+3UcpZk z!^?95S^C0ja^jwP`|{<+3cBVog$(mRdQmadS+Vh~z zS@|P}=|z3P6uS+&@QsMp0no9Od&27O&14zHXGAOEy zh~OKpymK5C%;LLb467@KgIiVwYbYd6wFxI{0-~MOGfTq$nBTB!{SrWmL9Hs}C&l&l#m?s*{tA?BHS4mVKHAVMqm63H<|c5n0~k)-kbg zXidai&9ZUy0~WFYYKT;oe~rytRk?)r8bptITsWj(@HLI;@=v5|XUnSls7$uaxFRL+ zRVMGuL3w}NbV1`^=Pw*0?>bm8+xfeY(1PikW*PB>>Tq(FR`91N0c2&>lL2sZo5=VD zQY{>7dh_TX98L2)n{2OV=T10~*YzX27i2Q7W86M4$?gZIXZaBq#sA*{PH8){|GUi;oM>e?ua7eF4WFuFYZSG| zze?srg|5Ti8Og{O zeFxuw9!U+zhyk?@w zjsA6(oKD=Ka;A>Ca)oPORxK+kxH#O@zhC!!XS4@=swnuMk>t+JmLmFiE^1aX3f<)D@`%K0FGK^gg1a1j>zi z2KhV>sjU7AX3F$SEqrXSC}fRx64GDoc%!u2Yag68Lw@w9v;xOONf@o)Lc|Uh3<21ctTYu-mFZuHk*+R{GjXHIGq3p)tFtQp%TYqD=j1&y)>@zxoxUJ!G@ zgI0XKmP6MNzw>nRxK$-Gbzs}dyfFzt>#5;f6oR27ql!%+{tr+(`(>%51|k`ML} zY4eE)Lxq|JMas(;JibNQds1bUB&r}ydMQXBY4x(^&fY_&LlQC)3hylc$~8&~|06-D z#T+%66rYbHX%^KuqJED_wuGB+=h`nWA!>1n0)3wZrBG3%`b^Ozv6__dNa@%V14|!D zQ?o$z5u0^8`giv%qE!BzZ!3j;BlDlJDk)h@9{nSQeEk!z9RGW) z${RSF3phEM*ce*>Xdp}585vj$|40=&S{S-GTiE?Op*vY&Lvr9}BO$XWy80IF+6@%n z5*2ueT_g@ofP#u5pxb7n*fv^Xtt7&?SRc{*2Ka-*!BuOpf}neHGCiHy$@Ka1^Dint z;DkmIL$-e)rj4o2WQV%Gy;Xg(_Bh#qeOsTM2f@KEe~4kJ8kNLQ+;(!j^bgJMcNhvklP5Z6I+9Fq@c&D~8Fb-4rmDT!MB5QC{Dsb;BharP*O;SF4& zc$wj-7Oep7#$WZN!1nznc@Vb<_Dn%ga-O#J(l=OGB`dy=Sy&$(5-n3zzu%d7E#^8`T@}V+5B;PP8J14#4cCPw-SQTdGa2gWL0*zKM z#DfSXs_iWOMt)0*+Y>Lkd=LlyoHjublNLefhKBv@JoC>P7N1_#> zv=mLWe96%EY;!ZGSQDbZWb#;tzqAGgx~uk+-$+2_8U`!ypbwXl z^2E-FkM1?lY@yt8=J3%QK+xaZ6ok=-y%=KXCD^0r!5vUneW>95PzCkOPO*t}p$;-> ze5j-BLT_;)cZQzR2CEsm@rU7GZfFtdp*a|g4wDr%8?2QkIGasRfDWT-Dvy*U{?IHT z*}wGnzdlSptl#ZF^sf)KT|BJs&kLG91^A6ls{CzFprZ6-Y!V0Xysh%9p%iMd7HLsS zN+^Un$tDV)T@i!v?3o0Fsx2qI(AX_$dDkBzQ@fRM%n zRXk6hb9Py#JXUs+7)w@eo;g%QQ95Yq!K_d=z{0dGS+pToEI6=Bo8+{k$7&Z zo4>PH(`ce8E-Ps&uv`NQ;U$%t;w~|@E3WVOCi~R4oj5wP?%<*1C%}Jq%a^q~T7u>K zML5AKfQDv6>PuT`{SrKHRAF+^&edg6+5R_#H?Lz3iGoWo#PCEd0DS;)2U({{X#zU^ zw_xv{4x7|t!S)>44J;KfA|DC?;uQ($l+5Vp7oeqf7{GBF9356nx|&B~gs+@N^gSdd zvb*>&W)|u#F{Z_b`f#GVtQ`pYv3#||N{xj1NgB<#=Odt6{eB%#9RLt5v zIi|0u70`#ai}9fJjKv7dE!9ZrOIX!3{$z_K5FBd-Kp-&e4(J$LD-)NMTp^_pB`RT; zftVVlK2g@+1Ahv2$D){@Y#cL#dUj9*&%#6 zd2m9{1NYp>)6=oAvqdCn5#cx{AJ%S8skUgMglu2*IAtd+z1>B&`MuEAS(D(<6X#Lj z?f4CFx$)M&$=7*>9v1ER4b6!SIz-m0e{o0BfkySREchp?WdVPpQCh!q$t>?rL!&Jg zd#heM;&~A}VEm8Dvy&P|J*eAV&w!&Nx6HFV&B8jJFVTmgLaswn!cx$&%JbTsloz!3 zMEz1d`k==`Ueub_JAy_&`!ogbwx27^ZXgFNAbx=g_I~5nO^r)}&myw~+yY*cJl4$I znNJ32M&K=0(2Dj_>@39`3=FX!v3nZHno_@q^!y}%(yw0PqOo=);6Y@&ylVe>nMOZ~ zd>j#QQSBn3oaWd;qy$&5(5H$Ayi)0haAYO6TH>FR?rhqHmNOO+(})NB zLI@B@v0)eq!ug`>G<@htRlp3n!EpU|n+G+AvXFrWSUsLMBfL*ZB`CRsIVHNTR&b?K zxBgsN0BjfB>UVcJ|x%=-zb%OV7lmZc& zxiupadZVF7)6QuhoY;;FK2b*qL0J-Rn-8!X4ZY$-ZSUXV5DFd7`T41c(#lAeLMoeT z4%g655v@7AqT!i@)Edt5JMbN(=Q-6{=L4iG8RA%}w;&pKmtWvI4?G9pVRp|RTw`g0 zD5c12B&A2&P6Ng~8WM2eIW=wxd?r7A*N+&!Be7PX3s|7~z=APxm=A?5 zt>xB4WG|*Td@VX{Rs)PV0|yK`oI3^xn(4c_j&vgxk_Y3o(-`_5o`V zRTghg6%l@(qodXN;dB#+OKJEEvhfcnc#BeO2|E(5df-!fKDZ!%9!^BJ_4)9P+9Dq5 zK1=(v?KmIp34r?z{NEWnLB3Px{XYwy-akun4F7xTRr2^zeYW{gcK9)>aJDdU5;w5@ zak=<+-PLH-|04pelTb%ULpuuuJC7DgyT@D|p{!V!0v3KpDnRjANN12q6SUR3mb9<- z>2r~IApQGhstZ!3*?5V z8#)hJ0TdZg0M-BK#nGFP>$i=qk82DO z7h;Ft!D5E15OgW)&%lej*?^1~2=*Z5$2VX>V{x8SC+{i10BbtUk9@I#Vi&hX)q
Q!LwySI{Bnv%Sm)yh{^sSVJ8&h_D-BJ_YZe5eCaAWU9b$O2c z$T|{vWVRtOL!xC0DTc(Qbe`ItNtt5hr<)VijD0{U;T#bUEp381_y`%ZIav?kuYG{iyYdEBPW=*xNSc;Rlt6~F4M`5G+VtOjc z*0qGzCb@gME5udTjJA-9O<&TWd~}ysBd(eVT1-H82-doyH9RST)|+Pb{o*;$j9Tjs zhU!IlsPsj8=(x3bAKJTopW3^6AKROHR^7wZ185wJGVhA~hEc|LP;k7NEz-@4p5o}F z`AD6naG3(n=NF9HTH81=F+Q|JOz$7wm9I<+#BSmB@o_cLt2GkW9|?7mM;r!JZp89l zbo!Hp8=n!XH1{GwaDU+k)pGp`C|cXkCU5%vcH)+v@0eK>%7gWxmuMu9YLlChA|_D@ zi#5zovN_!a-0?~pUV-Rj*1P)KwdU-LguR>YM&*Nen+ln8Q$?WFCJg%DY%K}2!!1FE zDv-A%Cbwo^p(lzac&_TZ-l#9kq`mhLcY3h9ZTUVCM(Ad&=EriQY5{jJv<5K&g|*Lk zgV%ILnf1%8V2B0E&;Sp4sYbYOvvMebLwYwzkRQ#F8GpTQq#uv=J`uaSJ34OWITeSGo6+-8Xw znCk*n{kdDEi)Hi&u^)~cs@iyCkFWB2SWZU|Uc%^43ZIZQ-vWNExCCtDWjqHs;;tWf$v{}0{p0Rvxkq``)*>+Akq%|Na zA`@~-Vfe|+(AIlqru+7Ceh4nsVmO9p9jc8}HX^W&ViBDXT+uXbT#R#idPn&L>+#b6 zflC-4C5-X;kUnR~L>PSLh*gvL68}RBsu#2l`s_9KjUWRhiqF`j)`y`2`YU(>3bdBj z?>iyjEhe-~$^I5!nn%B6Wh+I`FvLNvauve~eX<+Ipl&04 zT}};W&1a3%W?dJ2=N#0t?e+aK+%t}5q%jSLvp3jZ%?&F}nOOWr>+{GFIa%wO_2`et z=JzoRR~}iKuuR+azPI8;Gf9)z3kyA4EIOSl!sRR$DlW}0>&?GbgPojmjmnln;cTqCt=ADbE zZ8GAnoM+S1(5$i8^O4t`ue;vO4i}z0wz-QEIVe5_u03;}-!G1NyY8;h^}y;tzY}i5 zqQr#Ur3Fy8sSa$Q0ys+f`!`+>9WbvU_I`Sj;$4{S>O3?#inLHCrtLy~!s#WXV=oVP zeE93*Nc`PBi4q@%Ao$x4lw9vLHM!6mn3-b_cebF|n-2vt-zYVF_&sDE--J-P;2WHo z+@n2areE0o$LjvjlV2X7ZU@j+`{*8zq`JR3gKF#EW|#+{nMyo-a>nFFTg&vhyT=b} zDa8+v0(Dgx0yRL@ZXOYIlVSZ0|MFizy0VPW8;AfA5|pe!#j zX}Py^8fl5SyS4g1WSKKtnyP+_PoOwMMwu`(i@Z)diJp~U54*-miOchy7Z35eL>^M z4p<-aIxH4VUZgS783@H%M7P9hX>t{|RU7$n4T(brCG#h9e9p! z+o`i;EGGq3&pF;~5V~eBD}lC)>if$w%Vf}AFxGqO88|ApfHf&Bvu+xdG)@vuF}Yvk z)o;~k-%+0K0g+L`Wala!$=ZV|z$e%>f0%XoLib%)!R^RoS+{!#X?h-6uu zF&&KxORdZU&EwQFITIRLo(7TA3W}y6X{?Y%y2j0It!ekU#<)$qghZtpcS>L3uh`Uj z7GY;6f$9qKynP#oS3$$a{p^{D+0oJQ71`1?OAn_m8)UGZmj3l*ZI)`V-a>MKGGFG< z&^jg#Ok%(hhm>hSrZ5;Qga4u(?^i>GiW_j9%_7M>j(^|Om$#{k+^*ULnEgzW_1gCICtAD^WpC`A z{9&DXkG#01Xo)U$OC(L5Y$DQ|Q4C6CjUKk1UkPj$nXH##J{c8e#K|&{mA*;b$r0E4 zUNo0jthwA(c&N1l=PEe8Rw_8cEl|-eya9z&H3#n`B$t#+aJ03RFMzrV@gowbe8v(c zIFM60^0&lCFO10NU4w@|61xiZ4CVXeaKjd;d?sv52XM*lS8XiVjgWpRB;&U_C0g+`6B5V&w|O6B*_q zsATxL!M}+$He)1eOWECce#eS@2n^xhlB4<_Nn?yCVEQWDs(r`|@2GqLe<#(|&P0U? z$7V5IgpWf09uIf_RazRwC?qEqRaHyL?iiS05UiGesJy%^>-C{{ypTBI&B0-iUYhk> zIk<5xpsuV@g|z(AZD+C-;A!fTG=df1=<%nxy(a(IS+U{ME4ZbDEBtcD_3V=icT6*_ z)>|J?>&6%nvHhZERBtjK+s4xnut*@>GAmA5m*OTp$!^CHTr}vM4n(X1Q*;{e-Rd2BCF-u@1ZGm z!S8hJ6L=Gl4T_SDa7Xx|-{4mxveJg=ctf`BJ*fy!yF6Dz&?w(Q_6B}WQVtNI!BVBC zKfX<>7vd6C96}XAQmF-Jd?1Q4eTfRB3q7hCh0f!(JkdWT5<{iAE#dKy*Jxq&3a1@~ z8C||Dn2mFNyrUV|<-)C^_y7@8c2Fz+2jrae9deBDu;U}tJ{^xAdxCD248(k;dCJ%o z`y3sADe>U%suxwwv~8A1+R$VB=Q?%U?4joI$um;aH+eCrBqpn- z%79D_7rb;R-;-9RTrwi9dPlg8&@tfWhhZ(Vx&1PQ+6(huX`;M9x~LrW~~#3{j0Bh2kDU$}@!fFQej4VGkJv?M4rU^x!RU zEwhu$!CA_iDjFjrJa`aocySDX16?~;+wgav;}Zut6Mg%C4>}8FL?8)Kgwc(Qlj{@#2Pt0?G`$h7P#M+qoXtlV@d}%c&OzO+QYKK`kyXaK{U(O^2DyIXCZlNQjt0^8~8JzNGrIxhj}}M z&~QZlbx%t;MJ(Vux;2tgNKGlAqphLq%pd}JG9uoVHUo?|hN{pLQ6Em%r*+7t^<);X zm~6=qChlNAVXNN*Sow->*4;}T;l;D1I-5T{Bif@4_}=>l`tK;qqDdt5zvisCKhMAH z#r}`)7VW?LZqfdmXQ%zo5bJ00{Xb9^YKrk0Nf|oIW*K@(=`o2Vndz}ZDyk{!u}PVx zzd--+_WC*U{~DH3{?GI64IB+@On&@9X>EUAo&L+G{L^dozaI4C3G#2wr~hseW@K&g zKWs{uHu-9Je!3;4pE>eBltKUXb^*hG8I&413)$J&{D4N%7PcloU6bn%jPxJyQL?g* z9g+YFFEDiE`8rW^laCNzQmi7CTnPfwyg3VDHRAl>h=In6jeaVOP@!-CP60j3+#vpL zEYmh_oP0{-gTe7Or`L6x)6w?77QVi~jD8lWN@3RHcm80iV%M1A!+Y6iHM)05iC64tb$X2lV_%Txk@0l^hZqi^%Z?#- zE;LE0uFx)R08_S-#(wC=dS&}vj6P4>5ZWjhthP=*Hht&TdLtKDR;rXEX4*z0h74FA zMCINqrh3Vq;s%3MC1YL`{WjIAPkVL#3rj^9Pj9Ss7>7duy!9H0vYF%>1jh)EPqvlr6h%R%CxDsk| z!BACz7E%j?bm=pH6Eaw{+suniuY7C9Ut~1cWfOX9KW9=H><&kQlinPV3h9R>3nJvK z4L9(DRM=x;R&d#a@oFY7mB|m8h4692U5eYfcw|QKwqRsshN(q^v$4$)HgPpAJDJ`I zkqjq(8Cd!K!+wCd=d@w%~e$=gdUgD&wj$LQ1r>-E=O@c ze+Z$x{>6(JA-fNVr)X;*)40Eym1TtUZI1Pwwx1hUi+G1Jlk~vCYeXMNYtr)1?qwyg zsX_e*$h?380O00ou?0R@7-Fc59o$UvyVs4cUbujHUA>sH!}L54>`e` zHUx#Q+Hn&Og#YVOuo*niy*GU3rH;%f``nk#NN5-xrZ34NeH$l`4@t);4(+0|Z#I>Y z)~Kzs#exIAaf--65L0UHT_SvV8O2WYeD>Mq^Y6L!Xu8%vnpofG@w!}R7M28?i1*T&zp3X4^OMCY6(Dg<-! zXmcGQrRgHXGYre7GfTJ)rhl|rs%abKT_Nt24_Q``XH{88NVPW+`x4ZdrMuO0iZ0g` z%p}y};~T5gbb9SeL8BSc`SO#ixC$@QhXxZ=B}L`tP}&k?1oSPS=4%{UOHe0<_XWln zwbl5cn(j-qK`)vGHY5B5C|QZd5)W7c@{bNVXqJ!!n$^ufc?N9C-BF2QK1(kv++h!>$QbAjq)_b$$PcJdV+F7hz0Hu@ zqj+}m0qn{t^tD3DfBb~0B36|Q`bs*xs|$i^G4uNUEBl4g;op-;Wl~iThgga?+dL7s zUP(8lMO?g{GcYpDS{NM!UA8Hco?#}eNEioRBHy4`mq!Pd-9@-97|k$hpEX>xoX+dY zDr$wfm^P&}Wu{!%?)U_(%Mn79$(ywvu*kJ9r4u|MyYLI_67U7%6Gd_vb##Nerf@>& z8W11z$$~xEZt$dPG}+*IZky+os5Ju2eRi;1=rUEeIn>t-AzC_IGM-IXWK3^6QNU+2pe=MBn4I*R@A%-iLDCOHTE-O^wo$sL_h{dcPl=^muAQb`_BRm};=cy{qSkui;`WSsj9%c^+bIDQ z0`_?KX0<-=o!t{u(Ln)v>%VGL z0pC=GB7*AQ?N7N{ut*a%MH-tdtNmNC+Yf$|KS)BW(gQJ*z$d{+{j?(e&hgTy^2|AR9vx1Xre2fagGv0YXWqtNkg*v%40v?BJBt|f9wX5 z{QTlCM}b-0{mV?IG>TW_BdviUKhtosrBqdfq&Frdz>cF~yK{P@(w{Vr7z2qKFwLhc zQuogKO@~YwyS9%+d-zD7mJG~@?EFJLSn!a&mhE5$_4xBl&6QHMzL?CdzEnC~C3$X@ zvY!{_GR06ep5;<#cKCSJ%srxX=+pn?ywDwtJ2{TV;0DKBO2t++B(tIO4)Wh`rD13P z4fE$#%zkd=UzOB74gi=-*CuID&Z3zI^-`4U^S?dHxK8fP*;fE|a(KYMgMUo`THIS1f!*6dOI2 zFjC3O=-AL`6=9pp;`CYPTdVX z8(*?V&%QoipuH0>WKlL8A*zTKckD!paN@~hh zmXzm~qZhMGVdQGd=AG8&20HW0RGV8X{$9LldFZYm zE?}`Q3i?xJRz43S?VFMmqRyvWaS#(~Lempg9nTM$EFDP(Gzx#$r)W&lpFKqcAoJh-AxEw$-bjW>`_+gEi z2w`99#UbFZGiQjS8kj~@PGqpsPX`T{YOj`CaEqTFag;$jY z8_{Wzz>HXx&G*Dx<5skhpETxIdhKH?DtY@b9l8$l?UkM#J-Snmts7bd7xayKTFJ(u zyAT&@6cAYcs{PBfpqZa%sxhJ5nSZBPji?Zlf&}#L?t)vC4X5VLp%~fz2Sx<*oN<7` z?ge=k<=X7r<~F7Tvp9#HB{!mA!QWBOf%EiSJ6KIF8QZNjg&x~-%e*tflL(ji_S^sO ztmib1rp09uon}RcsFi#k)oLs@$?vs(i>5k3YN%$T(5Or(TZ5JW9mA6mIMD08=749$ z!d+l*iu{Il7^Yu}H;lgw=En1sJpCKPSqTCHy4(f&NPelr31^*l%KHq^QE>z>Ks_bH zjbD?({~8Din7IvZeJ>8Ey=e;I?thpzD=zE5UHeO|neioJwG;IyLk?xOz(yO&0DTU~ z^#)xcs|s>Flgmp;SmYJ4g(|HMu3v7#;c*Aa8iF#UZo7CvDq4>8#qLJ|YdZ!AsH%^_7N1IQjCro

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 From e6bc84ed50c62f97964869b1c60866c381ef2dc6 Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Mon, 10 Jul 2023 13:13:21 +0900 Subject: [PATCH 03/36] st-device-app: Remove brand icon after reviewing Signed-off-by: Jaehoon You Signed-off-by: Charles Kim --- .../main/res/drawable-hdpi/smartthings_icon.png | Bin 21996 -> 0 bytes .../main/res/drawable-mdpi/smartthings_icon.png | Bin 13686 -> 0 bytes .../drawable-night-hdpi/smartthings_icon.png | Bin 21343 -> 0 bytes .../drawable-night-mdpi/smartthings_icon.png | Bin 13311 -> 0 bytes .../drawable-night-xhdpi/smartthings_icon.png | Bin 29998 -> 0 bytes .../drawable-night-xxhdpi/smartthings_icon.png | Bin 45721 -> 0 bytes .../drawable-night-xxxhdpi/smartthings_icon.png | Bin 61217 -> 0 bytes .../res/drawable-night/smartthings_icon.png | Bin 9513 -> 0 bytes .../res/drawable-xhdpi/smartthings_icon.png | Bin 30892 -> 0 bytes .../res/drawable-xxhdpi/smartthings_icon.png | Bin 46956 -> 0 bytes .../res/drawable-xxxhdpi/smartthings_icon.png | Bin 63074 -> 0 bytes .../src/main/res/drawable/smartthings_icon.png | Bin 9814 -> 0 bytes .../main/src/main/res/layout/fragment_main.xml | 15 ++------------- .../src/main/res/layout/fragment_qrcode.xml | 8 -------- 14 files changed, 2 insertions(+), 21 deletions(-) delete mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-hdpi/smartthings_icon.png delete mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-mdpi/smartthings_icon.png delete mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-night-hdpi/smartthings_icon.png delete mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-night-mdpi/smartthings_icon.png delete mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xhdpi/smartthings_icon.png delete mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xxhdpi/smartthings_icon.png delete mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xxxhdpi/smartthings_icon.png delete mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-night/smartthings_icon.png delete mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-xhdpi/smartthings_icon.png delete mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-xxhdpi/smartthings_icon.png delete mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable-xxxhdpi/smartthings_icon.png delete mode 100644 examples/st-device-app/android/App/core/common/src/main/res/drawable/smartthings_icon.png diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-hdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-hdpi/smartthings_icon.png deleted file mode 100644 index c0fb2c99a0edf740e73a30bf60bb780194e4ca91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21996 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 bwlk7($pL*0>$*CC;tEn%)`6ER+J^rhH!kl& diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-mdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-mdpi/smartthings_icon.png deleted file mode 100644 index c9bd8ec9eb676caeb6568f8d7fa8a82dd7ad4974..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13686 zcmXYYWmKEb(>6tZ#oe9Y?(PuWp=fdUV#TF+aCd8iLvi=wR-m}MySu&N|GXcPlXLF5 zM|Q64&g@6kc@UFo~2MfKVKdo zL@=+qR-LuncdS2l-kW8+M&sa{Swi6kc!ayIaay86i=)GeN2~Q1)_Wpg)cIyW0f))5 zMn^_ilvO5V)dSXT8)#H=g}fS5C(h2!j!G&k`43*dv35SR!AuBUD<-{^6N%-$yc=G6 zjC-v=<^dtf&_gCeQmjp)`(*;q$#*Zt8o1qq_; zeA&wT&s#9w-rh%$kF5jGa%ostSZkW$({yKIVj}J(CB3aT|Gs1XpyY?=4f^b zWz$c6$tfw!I?Ya-TRS_+EzZu)*NQaLQkyRwPUCjj%2p0CGK1maXk>4mk5?Aw3K-K$ zfG~3SAo82R^Orc|1PSWS>T0&*i%rUTODiiQ5)u+WDLMeH!1>@zNl8hmjg5^$8k26& z+M3AC?X4d<@NYPoe{~A`T?RJWDwQ!r4?MtA0@KDMIzlM9xu>T`PD<*YUV@s2X0Ns8 zCZa&mWGTQ(A4>T*WPLQjQu&}U5tJL?}_1N0pu8OJ$MUsNx z6%7nl^RBP0UO)W^c0B{VbO0b`K>tiZ)@uFoUXQVwQMk;ltPBjc^nO*j2MVsP*NpFX z-{M{x3knLtT-Qkc>;2ygATjMpKw9AM-Ce;-nwl-5aW5ZD%~?r~E7N=nN{HV<_ykFY zgCKU?uR1z>`3()HhtvwG_B7pFL^Z(Fv^4FN)zxb+h&dtxvtjiM49K9vZU+A>58oN% zDXn!mKU%D_5)~nJ)q?If=TO3cK0jG3Dkk$ju2_LA zPcJW%(`x*hN(Y*fpa1bpDJycFnUV2pH-4S;mdO9X1vYyckQ%(^xjj}`u2sR%sKbOe z#aoC*tCGt!GLd%+z2EM@bb|Jw`anty9LkPsq@~q(^K{(Rm;q*dnqFLdbkWm05{0&= zFcbI)@nWON8Y8F>;%-x)3p$D9wrVKSe!ETmfY^t<%@8AgW=!kV7$5I+ zy;!I8-i@z7F#0U_A)`0Rqz6n*2g2oOO~@K}Z^y zy~YJg)rHqQ*gFE@3G(zk?=Kpi{A zPMoN94@595N-BLtp>=HREHuc{!W?bxr%!uVyQ7Ux;|7}|S|5Ymptn8`y z@|*r+)87R;-+(>ymBge_It|aJ zcV~f|=k4unEp-AeNUGRL3GP@7AQ=0;)pzntx!Ww{S3*j3|D|_wA2TO;a}QZDffiiH zA*6;!ValiBPvh@Y)P{z3E*i0~G85iSiW~=WClT@8S&pt5f=Bs)VMy$QeLCHU{qeC% z0I&K;)_RFe&jh0#jzv!aA(mRIuH5B=ixy_>7TCm8ET`jhTc$nV)FcYtJqZ8uxr^T$ z@jCIhPG$z-e?Hq;+1c4-Fb^<4a-B#hKTw4qs4}Szag|?K`1MSd|ENpA39;wg5U3WS z!_N8BdX36A;LbcfrQuhgkb5;DwTyCaA<%54`o5+5EJ^ZVhcPOi5R1E2kP{iqSs&df z)Xz`5DFIO%O%#UBoPcZbxLqSn?06hjrle@>>1l%cW-h!g$=-fHE!9l*1g=Gb8kvUW ziM6WXnP|cqrfIe^Prjt5+-D~5f=R4;x>{;MjlNHZR=kleH*EN*A3=tMTmz#HSgF#; zillqAoql&9<#e#H)%@)Zq#L-%OH-bHc{`@Dpj%{>Z)M@#{4r*7;CTxW6@4cHOQ`{o zQ$JAaW?Ukx;Op*wH=E$%q_XT|@f}?|HPi*ml)ay@{P7i!`YT2GuasctqR|MErsaR^ z$Kr~Lf4@^xtBfH&2V#EYP&u1c4-pBet`CJ>9n~rB!pxbm8`Gkcj(?;JC#lbxQ{Qo7 zD$!Ql>i9b$x4uEk-I84;hM@okyUqtf;S)cBr5*x=F8;vq%1nvJuxBObuzB75C-C&b z8Fl)_KhFyob>kv;qwx@pn~|XlI0peC^U?Ny0}HkTI&fyuJ{@KFW<&=}_|M3(^?gOf zR!p%49l6Qq(|Hqs5Cu&iUP9ufDBHWH#qJiXz@f1~^C$xLy&-hw9{b9Ioze^wHf)F& zy(ZBq(4HuNUc{F%Q7p)CO~X1vYsR1^F>MqigAV0t($THdu5|m#Cx$QURLZ!z-cMU` z3%5WD_xdK%cydG30GAI-$Colx=&k_a?R~~@HEX#iqFk*GyeqG53aQH@G z=6O&{oX)2WX5PAWbRaSmnd3Wo2EL7s(oSqtEaC2UIPSvf=jIaE)*J^$M@z}f{6sK~ zCjVBjl$QuH)+xU1&I9ovvO+9UNFwa7h&uQU-c{4-5C>W zp>P^+3ZJl!xQrDt>R0bqGTT*U8*t%XxhUt`FQg!xGOi~*Ccb=i8t+|qi@G5CHi?;& zp59EQj<(qWm*jNcCbNN!ft8{2Tt%k6owBXeY--9uGa$nl+roWE>btN|xl`*|k9d3z zYrw@zWn+93$p{lu&!?y9R=r!B5hPZ9=WH)tD#6W4x+1Jb%HA#Kx!R$2S z+Rkrq*r^uLI6es1lLa8xvm6)zaI}{)x>!H5!KqlxkP*cG-*&E^5qmK1DZHC~ zjWd9D>I*E4C+o_UpAW5(3s6>othJy~D}ukZC)oCSJS4i8ldt?NG#UEDbqYu29WwQ^ahMSYuTDSFhVNY z8ZNAhCn0Nr^N@t_U=a5cu9F~) zY6E|isO;mGbDLc0@PjO|dbdZdHjJZ4$hhmb7lTpwre}+p5D9hU;AyH9jhSOxRzX*{%s_P3kN-i|rx?RPgH*0m{)PGsV~V zb&I|=7;W@@!-C;@HK!pc&qO38cIQ%6QH)@~m~HppXdR}EOwh4qA%J%lU&fooRS!sO z#mlun`ZzY}{&}tJTaU~b5Am7P&;CPouplm0JPBS*P%`lMh+@BHhK(#}ikD4YRh2D+ zy)ny`)Nz$mL6S=6i^~p=Tr+wfK9B}Y!{Q&GREH~vnn3wIMTza+9Q&tj~I)4+!M zl~IPeH`CegF?ZTb;+%()My#%<3ocSaZh|Jm?9yjmibndz;`D1G^jmZs9oAgFm;h0o zD3K;4%a#Der!Kx#v6TGJw8X-6f~z5qa$4;!kD;xIco|7IMer8~cfZ5|NqDbgCiM4L zR=O0UY_G%Ao;iODKk6Bp5rewlzZK_;)t#{d&Si<-TTm3E!s$omfi?R+pGmDJIN)}Ci?~ks7DM?Xd}5|`)PzJ!xVpBb968eQrNnZ?d#js z8j20oc&24Gpj@^7Gb0LCkPrPeU(!|?cH9g=512?xrtm&R9>D#xPnh_;Yk|Eup~D`Y ztT3^L@ZLJ{E{1RFs1>5%xQ;%kNd5CT9E?0Q&FL0X>#IK-2o@#N0yA#$j5OQl{mlUA z>qq8f(Qbj^@w{Bm-9KgB^HPrdy|_rx_)dhD_Q(W{x81tB9Lm?WzfI|R?#B369fkgR z@G}BlON;+zPvD*i?OBCTWDb2qIy#ZBW6Z3rCL^dd_>GMu9*>0?HFe9h&9pg!RpkVw zR(C0tf@Oo!|G)9aUgWRKB76}lXW_O%ygP5m9G#4}_s|vn<|>Z)Q=|G5|FZu4d^Oxu zU>b2w89lccRmG!V?l2CM&z(8=*Xmbdwn@$M+30T*+V`4dyw@MEGSUl!pUif$?QpKw z%!r0X3r*`^G@KkAABD7cyi7GFjJzrz{4`Lu^rx;~Q&F7_cSc_I_7(V0GqVb%qwq!d z_CSMz@pj;_OPrzY22-k<)9W>#R4(2DQrKXmIPBO~)5*%x9udD)G5;6~~44i|0QaOrWp z&qUq|F{;>wF6o~cU8YhrB$tUiLk>k}JC?@870*10aIpWktZrafz-w)-xF3bL)BMEx zrl;5)#$h$>S+{oJrE>d$~F+W^SE_R zTr-Sm+4Ywqm@lo~x9io?M|?ckh5xggU-ds5M_ezmZvj;il+oWpiH+DAaVZVwlOM#i zv{D^YBw77eegqc_>`b9)gPGPlZ=i)-?L-_~**y%%x&&?S{Nl6N*<}0UD``_;Uw?J@z9Oxdbc$tPuR&12bho)m`?=R8zxTuR5PQV=mN`0})X;ry@)`|=q|oZ{ z`H2@w5Zsjq&*SE+xaTIf3=bTiOk&4hie3gAL&Wt+^1be>&AkAq?MYWht>M>cl&VXI z>F#iaj><eU@p}Gj&$9M`ZGq#xk*ndUL;8o!+D&F-maN2({Z4igXSE{#&8se% z}bEhcYN62g~1;3 zkd`+02VWCo@RkaDugk(nNt@@+mu_9QKc2Jx_jk;k9?^~eyaTZAZ74`SQ9&_*lrW8n zgN4N@6<2XmbuQ*nHGPdYjzQ+oy&b@d#GaaPUO0M{SYxY)xyCnBc2JVpXn11hwy}lu z+dt;l$v<78=KTLU9GkQ!C?+OCoY*sd)EOw-m)Dqltw8Cj6bj|HxqKKK$rzHG=_J;4 zIj9H!P~>RwG-<_|S5_vw^aIa4kGI>~J6LPJ88P8#E(n--2$(d4bYOL@h2#f2{E4~n zWiwjC*Cw*AO=Dt>ZF!T<*^v@YE8L_=Cj(E-h>aeVm-;lXqO_N&n|w5V4VB1`eJ{scvn%PDf)^_#>YXzzsGQz$WHm)Gfp0Zb( zM_8)@E2Ua&{Y>@;aEa*-917vJwy(H?k~rW}Pp4&u#jI;FcDiA<((1 z6o&LgyGNhY{4Q)(hs@zUj4l&b{{(O;J2~B-f;`nemdnG&d%cZT&w1V`cB@V!ClcMc zyd!LfZ~T@xu_v?~fhG6KF2QVSX1Awk;`m~Sc9znys$m||E?LRRwrhVuW*(jqnK%7Q z!zA12J-63feDbWLUA1@r3~u)wocbvW6s=FKjY-QDM+-L&Vx1?nOf#{{XN~+to=!x^ zj1r1BY^EbyIsfzn7r|8nS1+Vi!>h*og~=NUZ?~84JkI(-A;60ZpNX(XJ78fM^uC~m zgqOCfp`O#ct3yK#G_&+3Ru4T#g2`-qa%yfsLWvdm&KU_Zk*DYBO*K;jaj?G}TkwPG z()}Fg`zJ{F>e$A&^&d4DZEprc0xj0f;42;(u4i}H##@XMg3!U<#-8DoFzn+*vE9q6 z9V{=a17Qh{1L{;^$2F)ptg3MgtMv0Gu^@{m6qCL8{3U`Cvyl|n>GkmVt%Q+EN^3{k zG1~g!aN+?M;nC9I}Koh zNYnS*xUZn1;hITrUpSNCk|wKYO*?%@xzwD@@?CTIq26vNX^sws1T6Y=b=@omF5d^b zhqf5vOKh$nC}i`DBRH?kMUfJ74k<%lEh2nF-k|RFL#GyOz1Y_Q6Mvr6Ys)ZZgVg;& z0nt%#)C*e?SE7kR8VsGdA} zEt@?}g>Y4r|A6Tubhzk0IjkzLyi8GW31)BPa^v=+(eR9fEbm*HI*8*=ZHHAsogIAN ziV(i_bPO;Hpyo;xV9N1U_=%t|PNkjBd`<|_@>^&3w{tNy#C5Woz%4;>ptmuo6UWzK~) z{38FJhLQIWBwNjGOT_wMOI$n|)tfcH8!9u3@45>&bPoRoU4%JU?Nys$C&@W$J}Ji* zoet9}oO_0lEA~gb_zmE%uU`A*{>#`c<>#LLd$VelC|;5Mf9QFqDsK@g^JnOP$4q0w z@?h|Ng}BeEx?Jr`CWxo%q~;5MMHSQZ{05Q=;lA?7kddN~HxtT7+Ud1jjt5$1Y7zAVCx=Q;)jS(~=KYur!m9O>XK%c}jd1;{TqfX$dz%v^vQHOeswV(Pi4st;DxV|b@ z)W?5+bR{m^iMbXLZTv-R+77o>M4lVF>$$Y^9wnQK&Wu#To5E7UGLt!hLQmMBkLDuH zFK$$49B8#J|H`+ojdsl$09FY6J2opYro?R8XY^j7US)03u+p{i3%t@AnYzP=)Y-%^ zLCI5~GJ3Yn?76i{$hX=VI!dc~+T3yTW2@-6l=$ifUOhA_Q>^@k5i{UB46UB`q)`b~ zz}xNOVe>8Eort9}$Kz8cKWB$gbMx+ghf4v%_Z*nCW?U|s_g)r_X z&jFVwZRJ!?y|U4Ef=vIV$$ce)O$c zTA_5l_3iUb9pGQI8Fa8DC+GDD2MB?9eAb}?uiCoug2B5<2^KL|AUt=LVePS5O&23R zjWSOf8tKih%JJ*+zNIW5mfVsfYPdqUK%$2Sx91=0ZA^?9kOueSBr@aSu!mmV*bBfC zzTE1(JqP3I8?frtvkMG|X-X#Ro0cI=9-(Xql4C+yP0SClI(8CYv%bxwvW2yba|`0$ z>d_(z;qIKfUkoZq{P)!PD`eG4#cOQ^&)x^>@eMEN5n0sJ;N1PczUt)9HTLDVFC-O_ zJ;un4+#TA8$=%jDSwxiPj<|4FPNf#>$d|Xx_vK#A?{S|u-CA(+urZ=b?A$jR6DJaK zaN}-(NZ#4Rv&^dp2kt>xIsv57%?SY=+++@qXVr z&D2_~Sfc#m-_k`oL2C0Sx{t3%2%iDla=ECKTB3JxXFC?yYv_Rh`YZx7Kb*oCzmGTes zLP_J!%iBQmiwPHi*}n;gpbs~ug}FsiN5UF|+0^l97n=0%%8W~eCJJj*xGj(XIc%Ym zH7_TY_B=g~Zt_V-SK<;LDJ?6%aX5COe5vOBOE^FW)|5VCSSUS;mUgSVDwmNDBOwVc z3DfC*E5dUxi?ilBH!2>x;!Z(J*x-i(4fTKAmd=z9YcCPG6RtjnrbM$OFlphYV?}Sa z1tD~t@|{9RVzqi`6?^|g~+Yb8n}oS%2V zPtqaUI_M0cBHB@lcg&6}Y-mG)3p3OImf;%Jd(V+?xr(U~)SKqu)zb->>Fn!Quv~(K z*TUSzQGWA@{7-pu0#PR3{ zuF^UzTI)I0 zO-&tbADr;sOTDLgpDuP*0J}(n>GVJT+Qa2K#;X*6nJ&>K5N}!5rPNovY>oRa56WHM+VR>WeFDnK2&GB+y_ zAz~>DD{4Z`MZeD_nn54h{x{!Fx<#ejyA@iJ*hvicNc8#Gn3f@Tj=_VS0TF7$qKQW< zJ3qyLQJh#cOpI`omc2fNVSdxVNAq@rREo;fU-H5y*D2;hS2*+& zuutD9GBeS`&&N?kt~lo|%V<=YGiTuy*?60$#0Wpf!qf|m5#Thi)s_-Q;7YJcGujqY zBihb*k^YlRMaPY9A15q&<&qsap|Avuth1tjU6A)9btR@ddiRZ5+H6KD3zkY8HeAi? z>!%4NT|!47j(Ti#rZ#ee8?G~0%IS55OC_iZn*|VYA6zCT^mlyn*kyaZ?KmZpLK7Kb zGBFQR7Xxd&g%LRn1A7X7`0F40o9P0_Q$Cv>S;)bat?Z_Y(GMChCA(1(1~Of3{2Xn& zaJ&jJvttL9hE37X6Uq|bn|lEY3Q3@c{F?4`tfUpmtF&|3_9-=<^)W3FKNy>h$lSD4 zG(|?w4-MoR|Bn)ML1n*RR4+S}qK4PeAC(KhwSa=cVgKL)=$TJ;g%s^%w(3`Q2z(n- zO*Cb0wzo~BT>|9TK+fIHd=KG|UhSvo4i21unR|4kU02F9D=NfxzbIldZ~mw^Gdh*w zbK!FMLy40gOW=nGyGg{Xz$HCKG4>i5CTW;AKRnUa3uPCj&h71psBILN(EQee+)ztu3PBiZ>0jv0dHz$ic2=&(U({Nq z`#otXxoh{#LUk1|2l*Cz8h5>IWe{Z@yu^R`&>;q92Vx~iL^ z4d^2xNsO)*i%$Gy?}&CPKw2SWBu}|c@89z^ys08Z z1=&FV%FR)0r-|yXP+aU~SQCk@vx9>NHfClAn-ULl9VW}LnEBn!K}Zc~RfTkM1Vxp7 z7nkR}@wtjbV+nz(KO-fe{(IX$MwD$u^)mJ<4`uo20ke7K-kpMKo75Aur~z5Fyrjk94YqyfvuQ#9*YT)kx>x@dVm}t%Oo1HhqZ17Pv+YKIVe_GPD-h{#^d{cC zVs8-qZ~U$7`H*h5aY^OaGVwjr{y;aV{+5Ve{m2nu_WgY7krZM@Ng1QA!aw zq8aCGd{IbkATCpOo13+DUC`#G`LkoxoJuEZ*(I`8Xl8YF7Go%^Cv=#e{o%A}-&E6| z0sQy3QM2a^f_4Z}(rc`c7h}67#O(z8;S`Ddim{%9pH+a+s;pBGgtBn1Fy(U=MElHh$YBiFmkG!RX;ZR zzFa-oq-SCh)jYFaC-xMnfwOgb8*K1sA9$Rn?3CD&u*?h4%MhuLQF|uFD|>!^i|QH< zxRTIfA4mq7Wb$t&UfrxIW3}UL;Cd_|j5SRgqC)cC{3&)15cA8}e zzEoTr=PTH&sZm_xW8bf?gEO-OD5bxf`%FMj zcaLcNKeJeDR|Lc#8 z6!kN5Bm@vPv;S-GH+@0>v!X~E+EO|jt!)1d%gnw(e`=kBPh2}PW!A;fn!ZD;FJq~P z&;Dt4hR4HfIk0ZQtAyazLD=c0)wnU8je?z!vlde|J}D&4BTu?5Uq$!mad=PiVE`OK z*J@j)PL0j<9$-b{|9nU=QHu#fx~dy)XIW%=Uy4d>cPNpckH#{dfN9lTKcmBxoeru} zR1jCbI$&X*ot-5?OxpeRUEKY43}H&}C&$o80ehV1Qvx1VKx-R~Pg5e9)nK_qq|H?p z1u`}Co@GKR0~u@TXd1e9ilM(6z5g1eeXvy2G-Ut!Ta8ZTg$LTr&b^?W+RFfj(?D`s z(8Dw=mxtT7s^90e6<57SUPn`TM|qDpEXyQ0yl!afUpP)}!dcwGo55wMzB;SFs0Nw| zv>WMbW%Sw%_$HTPJX9J@rfG{WHgGhYj#m&Qgkwi)>XuJ=#ve<N{$P<1lx)xB1O5ZICUy;4j~CGmJNoR^h~1tCjoy zOl9=xl0!^`b``C?v*fkameA}f+z)DEPU6LoDP|tljmPcq!5-z-ei_jL{-d6=r@yzQ2rMct{~e zGu!ic*{8a$h~z6OckeI!IWO4xZcfyfM)0TgE~>9-m)6~fZgY{Sa1_fw$(+Wc3YJYu z#T78NXaL0SrG5NRef?@I`zcRq%9WvS=b`L8`iDM!cI1$VGz7W*0pMQp1Gct~Gy(+TUt00G7g(7$>yp-)i5?TU-}X1BMN; zY)4&$B~QTZ^*>-0oQ6u$Ju@F$mDg1sbzTk4-57ZLHl0ng0sDIbi{@-6dqw(iWiRsa*f$JE4?jzDdiw zOBq>O8vwtx>;98}$wmHHhi2OW=t)tNw6r&Zsdm2u$e ze(O7>T*}}PTyXD0AD`8~U?ZI|C5jyjhClL;5V+D_3)M zWW0Y)x8%_P7~>h)#KFsZD)^UvkWO^-?opR+b^3r_5PFc)hwvgUO*u$v(3i-l{bnlf zF2XuvlV}Q|^a`htwKos$s?Zy1XQYto9FxDlnsJCW1fXkcMWxq>VP9LF>HzC&lGq|% zI7R2wpjb9e0(kCHceHA|F}Y|MOZkLaDADU9qeMJh{73zK4s*)Kw3^7e+HA&!I4Hn2 zD*6=GnV*TIaw?8X0r`~iSDO@QE3EK?u0Z$CyD(?vM_v{3>T?m5NaWynG zZzmQPlSn7+Xr)beRn{eCwDVg1Uhcxv^2t?})i0w2kE;&@Vi_tjL!ER57)iPeeboM# zIk)hq+CL%38uG4406#tSA00L;=cC&myPNjArW`nXm1Xj6dmc9;u~RZD_qM?dp1Pk$ z#l+|q$?U6qkg;C=;1jXO1(uV9_QEF3|M6b)f6noc;Qn1{h$leOq572t=`uO%&_~yr z%?qml-^u3*iQD7uKknQ+M?7L-77HO7-IjXWFn5ehOuKG41oqr1>)k&b^=<^~Vr}{P zW@#mF9KMnemK1O(p~K%T4&Bb)9^ZC35`$o4NK40a!dX|uj!!vFo1hMx1v|9U{uokHv)bP+&Z)WnlOJaFieCfe_CHOPiTh+w^=l|)IO=x_>`LBUy zaw~-VBWU8yex_7AQxRnPOp4AaDst2sN!Mk{~jS7j)|eBbTEYl4knDN-cfOa$!ew5F1B+NOUY%=ThVLfMZ+le5}VonAT*t}YdO8jW=EXSoK zI_>S0+3B=j(~MJz`?lx#`kcLBx8_&$(6XuRk5T?zhJE=PqD1 zNU@hO{O)YEEh9AyViHo==_LFvy0oC8Wnc()e@zW@Ip%(`{m$1YMNl?s?D4_T{k8B= z7KGIPHsIV?LA36F14Ar&`nCDR!UM+t?dVhCl1$7L)mJkosrcRTps3mky7XkaRVU$| z-N_1W&-ajTf(dnZA}|aU{ig~pPb%TzcO$q7K+OGJOQ3KJZpMUiH_>QS~mc-XkdOPnDzw2 zh_;e^7|G`PJ)$D%m^nD`?&ibluGL_6En>4hAr#xZ$n4c6At ziu~m--lc%#30``y-2U1OEd)&=;YOMOgWe_brFsQV<)~%Tx{$p9!W^e=Y-|*EXwdtH z&`<9Fab$6 zR6>LUE#=pubfQ0rVb)B?h+4Ih8b^1nD$ew()AhFYLYwD%1^Puq0ZE_)wApW+?b;aL z-7@Dj)&E?gYoIfn+QujRb&0}V3rUoGBXC_I{H$4pR3-#Dbw@KhUjN4n}*p5aC;mg{JQi{o)(BfP;bo8R3?`vxL`2Fky;|O@N?1hMUYAg<> zPQjZ+UN)XPN2Q=Rj$?t`?uFC4G<6M)v%PE&{8q^5zyqj;tcTpm&T9134Ep?9{@MQ0 z(>n|=G&zh1!(BlwoyPL!gTbj`wrs3#6^JVBZ~Y*Qv;};m$n#cM$T?8}QpoGA`^xha z9^di7HGwmRS!8Yc#YB10##|7B`Ud`J-GqpbuF0lwp4ta;`WD2crKQ`V9)g?{|7a2@ z*N1Q|L1%2M`!pgg-|=kq23x7FPoelUA>krvWYUihDffXhY?@vCaeuQ9NOOM4JoQ`f zFTly0tKYWHhp{?Ure5UXUyHUOaHdPo25Hu*r|74tim5?}te~1vI;1o~^ML&7{$lIE z{SE3SNQ!aFR&Y%{Lo)Q$CZ7}(>9<%63IAUv$7?fzLZdJL|m(@$~?H|?t>8gCI6^x2x|S91L#ElUUa zvn-2(L3oe>dXNB$@$I*mK1yrd9dsXawAKnF!XniJ^~jT46y$UD9&*lo_YDSg)Mcfm zZzyASc;G+D$$Yr>0=PB+hVS9HAjm27R4UQjN6x4I5;6e5DS_c~VQ{|cw%n)kyY5*x zK+(AUY-@WyEhy*<_-XM00aLbUc8t(rlD$7)fO=dOd`x-)39f5n_&yboz=TG=A)uJb zodte=)74>ZiVlCJh6ME@DXj$HaoJ+cq-17@uBlH=oukFV#B@YW^21L8UG44X`ka;Z z^!S9xpAnr827i!wp)r^NUc4QJg|`TpECUf5k9!b5E{M5H0dG6 zRCa3WlV1Y4{GggqU*bQ%dmIC)kI@ez|8L8qpr2?n{Uey;I;#o)?6Sz9;<~!)-TL|& zvPfcF$R69&efWpy4OPkAP`2yx%OhSFl?&_B)04>0Z!~Pcw-G!eUuPKzeg7Va9R>Tp z`vci3stLF_o7>Rj4P|9zP9OYn`Xexj+7uH*h`hYKEihE8AUf+qtAx^rBnAPx2%x2< zr3)S96-aCPL=!GUwS2bJaGWJ47tu8GABai^A`5Sd?-o(-Nm(BC`-73(xtsdcA4mfJ z4Cs^p{{5Eq3Uc#8yct`)midD$Z7u0B36|KhAP4LhS5}@)sQ-3z8u#h3@r5kUuo!3f zGb?vIN0?4e!02YjijlZn7N9T!lKp*8P}jK!4cu zA=aPpK7p9&y=?ay<_%rPbgzO)PqD!$eTTP^|@BC?8Isf5KFs+=^i^ zhA^f%qax4RcsMy-o%Qusgp!8c)TsP20GU(E%g_FJAI&c8OZ&JCFZ7;GN7sD zcy`NzIR|}klU~L3UrSfjHMVTmxyi}PUr!zs@+a- zGYzW$;YdPeAu@F{-qIcSk*r^n*DiVhns9@qtou&x7DVeh0jL#FSX)qtvD#7a`%uQ z=QWNe`PrxV&+OCp9s~pEBEsBYMJu7C*F(GDJG(oSlzqmfInI@v9>k4--=%H@`Bg|% zun@Lhyg{&{!1oJW*c%1JfF%$2+1TtKf{XbnOf@t-%zoN(2DzHQb8Qi<$;>pWzqEI4 z@k#&tb@Y6teAK)}Xuc{e+kNcBHRH->^}vP1xn+g;_^G{pwR~~Wd0_tT=g*(ttmn#k z&#sPOo~?y(<(X*`!7A7HcE8C00smZK8@;JORS7qY2Th54qpMw7WI0(`q=*QbaRo(1 z8O`3PzhBcB0o~h!F}^l>%yaz8;rY$Y&6tV>H955|3qr301}eD%bP?cxX7GOXgnN?r z2BTvN%6z;CjEHC`Pvf+njnB=^?S6kjGsUG?21+EqkMmGoUhbA8ve@Ewra~ffc@DsU zkf6r0Qv7SwW?CVZSO6Jo)sGQUM8+xSVWtK~VqxFssf2_C4;;uBf5Z?gB(Tac5gwj< zL0#RqHLo*bfl8;Hp&UKD8%M_(sRNh)eA)`)6bpl7s5ASPGH$ZFoh~co78DrDb<;Xv z8LJx_zAc`vwA@{VsbpM|sr)yGUYL9wF@X~%I1vI&VFdJcx8Yi=X**d3g|^SYpy5d5 zuyw~KJt+c0mKWo>^4|u!Ev^boxZt*Iy4&dus(kYE{}+$MZgnwfV32zH>o2X(-!9pM zgM)XtQf%81LvS=Jubalk#`ZFNZWj!%=;AO%V(21H-G#aSo2-oy5_vD2vZsfK$E;h& zQyYSllT$l*lGJ%(ZSC#%-J0Lq+;Vygf(R}m#s6XtpjZqq1a8thpkavYhUSeD3%EN_ z;)3-VWx@2$|BYFT0V1aYKwCQ`e>N~kmxHEjHVWAPtLbL1)#S7jD!{iLd1os2Z}7pS z#@J%ZaARXr>sqMFDk_tdIFP*9Rqn~q=>zZANvV!1NC7}^ z<&eTHtgUBY@R}186m+zohOxq`790}t_{PM{{E8ie_O0)Ujr?EtWW(t4NYVqu_#n`K zXJ!OqGlUO7P)XOXVZK^?roOMaXMAab-1ZCAJ0MZun5s+IzbFrbM~MPl=wu#`revhb zs$?b>~wG9Y}1)dEA z{cAldZnI<%tfqIf57Pl&{I$Wx*K~!g&S?hQh9X`urT~td3YM$4fH68 z+*Q->oqP(a&5K-i!$f4Hr5mFqfZ9}Xhr$1U*DQL9+!;9DG(kTjWL-WlaOLq*!&&*% z)E9fzHsF7FLabelbDMbwh6qL2#85o79M`31mKk5ze>OED@=^4vZSML$3>*4li_oN1 zZJ>Ax6xy7Ki5m)Izya zu4dS5W?!bHzh5tJrn(4l6#z8j$pYTt6`!2!#QvS;J&P!?QvJ80(EyE-Vfa)Dzkl!H zU}Fo4*`utl^t*aL*Y&s;A5wVgkx0CBQi^HttI7i^rPq)h*o~=%I&S=!^c$_uK&5Z% zD32=_X(02OgqboXlxV>I(s!=}N^+$=wotX zl6(%?j3JCYy}($ry6n#Mpw1fQ==rhOU;5b`nrP>lA0dyf{zY1e{rITiV&Zu0218 zzfne*IJc6({1;CFSc)L0qa(ss&QzNn<9)!VHOjxZGQv8rts2b$wW%$3I0(^ z1?APL{PU10raM~W`ILjKSF0 z_WHcZZM_I@rwH}XTRMu!dk;}_gH1poi&IAJnKSx0*T6}|Uq26S4$5? zL0+aa{vzuO%Bo7Nmv#j?O~^-n&ucu-8Iy*kGkO*lw|7z}nnU<^h5@W79si_x*xB2D zy9U2ctLQHer$Pq|nBpVGN+5B~oqYd+P!8wMzfxaz7($qDnpyD%1cULGIsAkE<2qwN zJ%}sW^L*W_p|?c_I;UohIvg{m)Gv3F3__Mk#!0_zt5i+fb>crGCms8U7#`nf@}V&L z1Fq8#%x?>!mO*p*ZDatk_vCj`hV+lyDFk?+5}@dIV+5fVwez5e{U~to={cD_7Hh4z zC-L_VrPQZ3-LKT>KVj)`0IFXCuK)JfHvNqwC%+z*;w| z-M+4U+c(4`(=P#8|D*?SX*Gce=l9P!$A&bxl0OAZ-beB82vh!4!;)Xill14{kE;5h zCQ94dGVx_Sdfm6H!dPztEVhJnBZ>H*K@&lUn1zb}Qvs2ta51m2vLL13IfFnD<~_EU z^WNACY??t5gVTvYAS^v`G$iXvAEwae6v=9dCBr`MxH?ar=O#$lP2ioS(IT z0HCKR&i?@Ql}Lb?Sxd{s5|dbl0tb&K$Q|=<(Dn7T^}+Gb$aobcw?rBVH&sYFpK66i z3qmrVLuHe$Y>o5q>9PS^t&4ZQK~Iclq7{O~KlzO#i_v9x{~YA2H7XH>qoJZ676#`{ zDHdKTvSL!jm|4TnL$s+OKl*cJlT{C;&0sG2w{>#hs(H+Cl%HQk^3oT`@9?acy)OqH zlq#|+DxklJ?^_C3CH#s#yt324Fnf)l#=ERnK~XS~;nQ)hu3gg?`m|pg%iR3vOELPr znNsy*<_Ff7nxL3de#k{>(^mr{?$3|QcF)5tv??oqX$dI-)p(bH0IHB(Gb&SKSI_y| z(c|-dGiZoLe3YvQ-LC>9YF`^Ah9;PIXjX*=ws@80IhTb06>_#DJKl(~q*R{{G>X9# zO++&!PvG%=cE=DC+Ftr`9?a`8?|Yq1<(mk=Xu>0K2*2N4D>+Xqq1{@=_n2~~RGIz@ z`GzpIE?uIgArdh7N=g&*>d_CrI&MTXn*4Klc^S#1TVMN$82@ab2c6+Q&Cpep0rk?J zp^_9dJnd10#LV2^w7@)ow3tdFv+>`<$_ zFx{(rV=k0^s{O#jm{3s+@a+3XA7U5CeT?7C=EJnYeE~0~%AptZj99SP1jMuS`|Q#F6fz&`NxFpH^oM zc^5Onjh=^vpgi|4v!&W{?$;C?Dee0OLHswCO}hAi;Rn+nhoS*tWFrcQF%FE`S72C~ zGSNx#fG~m?bHwoDG5)mXxTG}O0X5Q;v8g(NNeQx7v4C8f8p4307P?ylfJc2#ky?5Ne}@SMP&7(qe_#5^U<$2jmJi4b7E4-Jwb0 zi2^@qEz)?!^e>cG>_XC{3z!)<-O}bH+=*aC2QzwxSS3Qk=gkR~Vy2-v)u~OO>wwiX z)YRA$R;ZEhTy)<T4XvXv=@mv zU}W%PI*q2J&xNykJ->vT8tr)W3RdhghEq`$Sg~>zaHy?Vs6yV^(InK>_l4~#iYH(KTLPdB zd9O`y4rdX&c%8d`qy1RSudICrR`3!|4Rk_9gOr;s*(S#Qh|K#jeGz_uCORl9 ziwXi4(Z(`{$bVvup5E!UMlEwMC_)WgY*AU_Cgb$PZu-#^lnXl|qtqqkRO9dzL?mA= z^?I*UHv4Bi%1=V&8tg67pIMjVkxO=@{=W>KjUxeAi2tERVNg58zTVG{z_P)8#+g;* zrW}tY+o38g1QURzZ{^rLv3=a%ve#1eumZ2g#)gf~ob}?? z&6RzUv6x>kya}TxcE+qzTsF=}wDd>iZ1LWrz`d~PH1Yq;vtqUxC$8J)BnDEm!Tv<_PkDHpy<6`}vryrqCML9F><+3OG*=E6GOY*1 zp(0kzG_0lCcA_iJWG(gOMk8p5M(b6X(xJu>^3l=z#D6sDmWDF0wi{T}<#Ra8)${fm zQ_rOa=Qq%onEq2Bu?8C~yK976{#fZck#D$=EX+~q4jw^5&E97vWsnH`pS%wH+A22q zwN7%|RaiIIe%bj$$EqQVF!^Acdt$s1lN>c0)nFVs^^j8%9tKniKwaI3c~TzH&w+2-kYTX_2;%=elxVQv$uS$}}e zCD(pCp>UTu^85kut`$29_S2l?mB6-_kJ_%m%`5n-4y;gh==|Yt)3wBc(uxo%mxl9) z�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 diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xxhdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xxhdpi/smartthings_icon.png deleted file mode 100644 index 0726fb9f2b170083b46c96086d28d49046e73a62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45721 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 F{(lqjMF#)? diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xxxhdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-night-xxxhdpi/smartthings_icon.png deleted file mode 100644 index 3813acecec631a0bf86c43be528d585fa2eba990..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61217 zcmYgX1yodP*B(l`L%O6HKuWsPK@pJ{xN^jQSsKEXpFM{!TU4bt}%4>IWqd-T%Mn3ebw z_0h+>0lUY~EUU%D7@qKdvQ1ie=FWeFPZ2u9&;x!FM9va2iHh<>4m`DR^~Nr)27~F4o(LF=;9S*%(B5nUS3wxC<&ABzQRQTvM(RgA%jcQTRA{SE;>vYA|rB2sMhzWVoFdqK@UIu~G z*fA=y8HHupA@X0mGru=-M55-3Lh{~ddGYcT91GaZD^8-_zr7$Ih}OD>Q839sBKBbs zrzC0Ybms*Ot2d>_Wo2<-S0mSWx4NLswn{DY$vI^(|6((ensI_ zSi;Hd%MkOBF*958Iz9RQ`}ZpFgElY`BhNUYxk+Y5{`1zHuVLQF;N;}wX4orB!sk@n z%82_V0Soc#p`cWG@7F)oXk-5~H&j$4vZN68UcCH}6AiuhSR8tF;=|3RomiZ%Rh|cn zCH(;%f8LmZ$(lx+sj)&S#)j9?{+|xV z52+KS4JJxKM&o4*rm9bA9G+5!#j|aFzh4#TJrxoeNxH)Yu^Xx;mip7YoE)=__Z0j~ z?s+6ukMj~Zb2KQMhNG&#!>Jsb4{QPg0tSUz4`Q39r>A|eAHy-lelapy^~Xh-koVXa zo!VVR)0t z`YaT0Dmm+LrjQ=Wa{Z?td{k(hP+pS3%TBzK(f1x3Q(XRir;_ey$!~<4)!1v}1cQ9@ z)Qjd>h$2udOTIh}(^GGhjiPuhVoUy$fD`GyBSy5C%$G##Zgi}mrnCRcom`=2GU#DY|koodjEC+vfq`ASM=Tt}Wy^kqt1ePn-? z55^6ZP1U^OlV5=_5e*(AT(WdH!D@@4ni8IkSBs;b@gGlQ2?ME+szIjggEoH_S1sa{ zj!sM%l_cpxci{MAw#Y$b{N2uq;W`O+qW8;)qeBLhLc+DS*^}(KcT%LexVW^tmJU8) zl!B(xf>O-7VkG0O;0)C*zd$Br_sz(ukW#P`9AE$Ac)iJ-zg)44(;;f zVU+>K#tW(CZMT<$t;cyhw^c1IEka!*1eW(J52VJZKuuTY;9#t*l;xbRm#W@_;IV}W# z+Xq7A0`uM{slOzQh)`~sVEcF1oqL$+zWl~gGdL{lHGQD-z*RGaRwl);=!nB=>k1sztjKjNOp`w%sR21}Ekw6_duZ5MqjD_287vc&%knnN?2i$fWatzNG-m zcXe~~b2wOxqC5H!k2I^x)@g&_8~;8F=%`Q@Wp;}PT9gX80~a_53x(5Omf#PjiyS?= zTmz{+>FDU-x!Kfi`(0z%k1M8c_PB%7FU;h)+WmihfIvwAFkq@d(qL~*cim-tPPbcX z^YT`RKdTjrupJ?1i{jwn-JTCA(fPgU2#ck8(_b;ATKK6>_P&E&_8-H8SySA~?1C!t zlKu~sYiNPa@FA_&((>N89mFC1yYT45D_`UxVjQjpW6$6=R42y^n`!H2sTU*;n=YM{LKQT5ot3Nk{B&~By zEq=bbrmLsdw&{H!V-Ovh@*i_zZA?(#vkUpUC9V)EjWDF`&ceY(EXAhn`nCcddaTI!&seu)QYhDoX=j1RJ1%JyjM&Vv|paa zZ{=TAUtit=gY{1t_Frd+%CVDLj@`$$4~4}x4CY!`ztHvg`y!E7Wu^{ea6oT6?AVWU z=x+8qwkFEwcgS5K@~Y%v@y43>3nniwE^Ifgt5<{cyM}4^VIf;GBYo!tJ(jdo`Fz&A z))I@rd#x^%{x;TX*JRH7Ig_VGmbZVI)_wLczR*ukNvUi2lSAW$iS7fW_T}T_V_%E$ z(lq?W%-q4p?-(u@pBoIsowOF_=+;^d_s zN>})k`{BA(I<)}9j74?}SSfeec~rh0`qIBbLjlsrL_}N3(@Lq9S|AEd@VZzjEa#e# zvula`Z5^o3!PovJsrX?$q17Foxaa!qKO5?sgB;jvNv^nuA8;OgR&LbhUvH*J%;@}< z;6DLCpM$%7ku|K=Re|bF$6+)Us2GLeKjeg%usAnw6|cMo@YSX!pH>K9a|mFd zfI*+Rt5?+)pO(;a82RMbHD3m}{GAhsM72``;cDp0R#OxG`@N51uV>BTmCbd$lpcV_ ztmj+(s2&3GkhiPvRmA<_4J?QhrZNoIww#>6EC)$n03h|cT8TMDxa1yL1N9a-E7K+QEOjdUTv)wl#S_Va__u`bBzF%&04l>A-R}L&R>w44ygaN0n*iS&T zCnLXaXF;yGK=xL>*ihT3@*k(sEYb37LNt7D;pusvcX`Ra=Q_j1&e(+m;N$+^hJl-; zU$MZKb~n#FJMEr2^$Sk;!Vs;N9}z`>#Sk`)X$n&?e}H{|RV;J}!UDEIb^s;Ak`t?% zIdtmdm*z((pk-Uc3MZ$gE=;;+0YFhCqyIaMS_|@+ED%9n$=hsiwY2!{xVgCrrFv+9 z0wWN3al3H2Rqiu>@XG-ara$~`CVhhW42{gs-Jhk|d4J*a6~dx#0JzeOb(lI-t~PtH z*!cYZLJ`P84DcxRVpVz5(-VUx!)B+|zO*dxULgpSXi^t&)vY8s>`)gx^1|%)xy|s- z;@@FF8ie!p1nQ7b1@jb|I^MzYwzD~(02|tK@ZCDl*6s3m<1XOx*qY8myg$%{d=`9< z_SxR34DEa)Q=+ep7y5|*^-eSpTdv>Lsl9&l`C=FK3$NkF?`6pN{*Iz)K=J$+b6;m`Z^0RQ_Bkide!$ZpYt0#}D1g@~YI=+Me z)(E~+4))6!mnl?a4Ik*8n?v$~6&N*MhLPUX^ZzUxoi5SZOFsDEpM`h9kvQDzARI#`S8;T+{4X zS(e0XP4eLvHr&|9PAt&_r{KRUz7iQI?nNTU^Nk0$q$K&KGX>A zI6gie-Ydlf3N#9l{k-}Q``RN{%}_5+A^p!z##Ct;524drO-{VX*u2#TWRjLIDUY)y zT$Yo>>+TA#m(}XsI^J-sG`z0TG$D+IfWMSfhE$8^*0C_|Ws;_fk@Y8%j!@~4V${%G zFI)+gA%aF`I1q1?pgDi%C2hgx5oi%Jh1A*H?05AF2>rSz_H~>Z39NJC+yQsL8Ej(= zMZJEz41A|`i(?@&C7f05j+!!EFWz_s%evkO#Wp`l->|d7NS9|kcm~!A_+&N%5clJ1 zmU}N-;M5CLU>~Dr#63L;3gUku&lqoE_X?wNc6KAX*J%4XquKMY?_C4$kEYGY_x#<9 zq^9w_#g)0#_2nOVHE%Buv0-r7tF5V30`jZVo$0Th2c5AS2Ok{^bHYr_1I+%81HuTY zLWKec?epanqbW_*e6`gcEQ*ZlcOOeIJ=HUomFl*gB*$GbhyG4A2-6}V3%kZU1(sjx z%G5F`ager2rHB0~QZ26WA(}DhNRsiumB9BnC&1av$H%9fb_fABrF4I{jeb%bFEv#@ z_~!Tj>^T_&0+}H$Yxok!+H~$SFhhX$e7m3BH?2be-KCePuPzbPDoey=m31nHK;!E2 zL1}!z@>EMzy~pcOeNRo3cqR&^qb^I?R*CErH_{Xo^AMPaQ0;nRoAlFpoebG z3mjJFv>e<)&)=A&j6WF7YKWb~p_?|0<83?I`fL*enVEi|K>Xvgv%8}j>*rZ--Y)|> zWe&0V-yuNApL73#8F$Z4*R>1}2XlTIwVS0jx`bHCGcnGurmFdGVx%W4x?+<;eyDBq zu%|&@7$&{<|56d3IfH}wln)*!tLR;Yn@LlbFLq~N?i+ANSf_HXi*R$`UQ=ZD9=DYD z?`ZU2A(X~Ww8jGX;vdoJr+`}(@xg${+;QNNiJ&Oc{mq6x5Hc>SOb1OjG1}XsJJ%AR zH0W0hroa3>7koI;bgK8rqkgf{!j^S;4ASjSYw@1DN&TI>Y=bUlM3*=@q^AR}3xl`K zi}GBd1o2G+jQR>8H-@)dP=(1{(BID{kdc|%IsdX3A+<6#zoow{n9qxizB?&HNgJBB z_ncuMsLqJfe%I;1yo^_so5ji$_8zD511zK}6x!!5yGsyNog7DF`Lv!0B2}&(*Xe7& zcAjj~&FbNyo4O?U((CFvO-A3K5Lw&MYvsl=Mq$tz%C6~1{u8uC`*#i)DG3_JpD(dE zzKtj~u4Ec**RK9hrr3yN=R3Sfgi%JB7j-89|A_rCg_D^d6#sDEbyG5=a}-SZtqi4Y zT2JuipU7^$} zL+0_0nG#|YFg^2iM!fuKS(ccA<=EJAZ3tclMUoYs2mA~#tD;QGr{+b1&fKse16gIS zrsw>;#4VMTknWxT#%7*ZG%j1-|IliQ`2}SdZ#U%cwu0V%E<_?LE~j5_y#>Gz?@3EV zz>jou?5g(#lq#hxV7f-*I^X3l7vm>k$Qn;Xo(M1*`JX($kV22qn;66^P@J`DmLYTM z?^<11gI|#iWE?|-WL-2(5bCYdf0zdW&S%D0=SaVArLD361y=+AW9pcKvLS~5%mqoU z1`A*u74P~g%dZ}-P6qX4|JMZ1I!oJ! zjg2OO`?=+JPK=L(yT5s6trEwVnK$BZuqYVANKIZoa^NqxRED;?_J1xEb#{~3N-Cl%mhuatF5hEZ=H+;8(I^3DV`r^0{R@UJ;?ecT z%=bH<#R&o8gN3AHhTqMA*xpQcSRlQK@ME_5EzvZJN{Y>WEO&G4O5tGeNP#?TL(H*7 zW3Iv2vM2TX&e~wAqhXVL{&+}fk7XFN3QY$%VDf|WIp{BxjTm1x%b*Zz=;>W?^9yWv zx}w1E#iactEQ+ywR7tA_E3$-1MJl8+BT~?@b z3@8TDUo@rS^{UypQV^9xz*EK5ACe)9wS*g?FPp&gZ9(!ovo3 z)gWBvZuA(J1Nqa7`WLeXd;;l7NxhQm6-4epY9 zNV29`7$)b6uhq6b;b`;kf^0bpkZ}K03&IrhzdoNI$dcMSx;%K=@i?YJ;666paVVmt zJUdAS1lBp=MksT*Gq5x+Ae>Glm!zq{oCL#)=-L^WzJ(v6wPKflD9hqE*ll`qS~%Sg z0XGy^e#OOMUS@Tqu4id?wCwxf^vUID{Lg>9SW@#B;wA;|P%|?!sxbZrEA>R}ITL*W zP3*_1T*j*ML=!9fKvA79#*@A_Ei(V+X^DW)sBYr4r!JO+|Nd7&B!9Co)+~g4EfS^> zcuywxD`mBfdy+n_udhQ93UBox5@_X34|A$-_d%7QsQG2nHLZ*Sw)Eyt zKhMO1uJiWnWc^)C+ds~XY4ve{Spb6$^fD1LA8K(qyk?|yfs$(7G-foc#IiB(AAvGnmoyuTai3@7(TsoMhIm2bo+tl&?>wAHBBuxKMV&!PRmWGCgXg6FC zn-KrA2CKn2J(`X}v%J5rf^J_GVu4@nU?WHcb%cCMWf`FWPlo6t_Kpe`o`FbCLrtjV zxWdY%*YluHdmciANy_Up=)N3r8EKwgT_p;S>PBu~sHuu*Bno>Q~p?Lm?XPTru zW|}6v1=vfkkehaSY(9KEvAWPOp-`rDHjR5CyI-!%R8{&92MW|MxwpKpxjGWrtR&kJ zHIRSZGhJbPhkyq3w9h0y&Tvvw-r66V$f9SA{jau|(uiyi6F7gEqU(4Q_YC8be+b+v zZ~Jo-ql9*bdmrvKvU{|Qd(yv^O`~^CDHF)wbmVkAoRS6a(nryFrcvUeyU)IePN(vz zqmLS{wQT;tkkb0+4^a#`d7G!Wf8vsi$#0DN+1>K~0Zuu`vUsrH!D44XyEhu>JQ>&- z`;dPP92hym!RQgy%|bYp&)OmAwmD5Vai+)0_}mT)1UgqSC(7vw(FXF(i-3$;gD-2G zMyk}u!ND%*jJM4J-kt8}05b?4{;b&Yj`NJ3E&ER7-l_WJb>07J0cL;$Y{^9?wBkgy zAk-NB%RvHsvAHoe+Sbk~n*@9RTNP@7H_n<;;wy^=HXbn4gM<1oIvme@vsx$KwtCE^h8Py$= zT3F)sK&_xx51DBt>qrs-64^Q3-`#5eog2*QL2B}V(vAKnPL-WGF%l?SoP`ANKWb)w^x|8DVut>sv9hN!W+on_q0QDZMQLJMcBi~x*Gz3+2-VKkqc z6j{AUVBTLzIk8@?ZQ?ZVpauA0OAAVn0do0S29-}42iPzfY6s9b1xgwZN3ac*CfMW;wYR6c^SXTV>0o!)z96| zy7!|gOnEiDosY08pTRJnCXvZvV8lL=-9@GPf44Z)`z*&4Z9&=NEDPkDlE%NHfG?l9 zSzTq@>R1(`J`@=BMAgz5umP(M((Yg{t1IUw99|y`{h{*F@zgYT3Wt6)b2X8vDAjK` zr0fdZ(((KMZp#IdMVd|d<-oDk0E1PdBrXEZ>o2R!Zw{F~1C6rGP!U@jOKwGUtv-S% zO2O2DtDQZngp97>ho%=3!K`^g@d+k!r9E&cLkjaN%nEv_BD5pWl)LPMmDdh`!ASBP(lh7u*R3fr5wughV6-XqH$)|37St{1rVSgRzQ z0GOncwkdB(#fOo|pHSX#43f?Q$rGzRS8+#N6^ehC&L&pv_RBJ>>_IV5Hlt>~1Z!8f zHF`X#FEnUuh4xuppP!Z6Z75D~D*X>hf!$6>>x7p&9v+Tv;(UwiW{seP%U6$4CrcG5U3Cu?`!oeD=ibV8IkjcTLwXn zt{(PPt*%G-6)@!~YC(bR%+*)W1`vc@umU`@>6U5W);<@qNXddJ5*a zB@aQqw)P;c=Q*@%Pw3vGfdV7>GqJ#Fr!uP)TacnqJG?>x+X36Ee6IshOs|?TKwI8* zm$iJ?S(5RKHFGCH=nCDhKE!ZmH#OY7CH`b>>NlpBR{-437Wu8s&-ZBqHl~85%7_sQ zl|8nKIYYET?elL5jN?Jk#Gt@-iWh--ui} zAOKisv>S`lawQ?D#3fEAlsRu8nSEoEDq%X{G}7%N;4Yk*uewaU>*raPO-6n=JP$nLs{nG6$@c2Uyg0f8c!%0W>_{)jw7vidQOj6w-+ zxW&?;*Wp4;S)ZLHcID(YsJlT+Hq320bC-X-_UzWP{<`BMw#C$OSORyWRjeDlrOnqs z6(6^ttDwt9**o1mt~2vtIX%Eb_yj3a@YAK*n3m8ZVTigS!l_cDFf4Gpvh4|8u2#!Z z)l(yfv}NZ_=WXAa)$`PBL@;MDgW;7wJ3ZnEJoad3^{b+$C5eA7Nsb=Lsfs{&0 z<&ToXO8CgP*gBO}2ylt${Xz|4fdvTd`OEz_l3)zW`5oy~s+c(jO=n2K&yZ5dmyhCi z&mR3Uv~IJe@=+7WZjhTQWMjd8iCs@@!aHX+<`+G01uy5(sipRY#e&>7jp3>^4hRC# zEU*zgO$8MN1rk}C%AkPMJQ0(%${qZ`n+Uj5_LmQ1o#Q~xOK&joLI|jODh~3p91&G| z-T7k0aVHSY6=MwNrm>t_EgVNUrH0v9a?=Uw*R(%((O^>G52#}wkjU~hG(2c3M@L7& zX7)LhA@V&P69&fp8(01ndPE&PefmDN#0k`zQ2F{*if8%DKy^r%+fC&}Ec_>Y4c??@ zsXNg@J1Arrp`lJY?eXkMo9{30<;o!WRf_Lr1s-)cz4cg8)~cn7y9QN(XCRKqGHy$B zXkW3JU#W=(8$dmFw+(44bo9#rQTg`{h{QKypJHKS@=&huRbI z8?g&pn%6pQuft|$#Gj}1f3OL)I*fmow;W1buo8~03O&31bNkBK{Fhiwf`H=u6X#|~ z?07dHopnH^YtU$@HC;&Wmy#$y%|VUUv7W%}*TbKaqmgi6%TWC1PNrjZ0 z$7^knOW%L^qb5&Quqyy!CEDeNx;xl7V?{f|7ga~y))!9Nje0VGPE&3J-j(hix~(2> zGn(}4{+O@$$l1g!!%a^`F8Wz{gtEP`0cua_g0tykhO4WQ+2^+{9?B1>lTBs@?ZdQY zf=J7!e~<#Y)lcW8x2`IKXWZ%iO(4=PO#`sG79BrOeDqPVy>^pded3~2LX8(ZAw%YJ zS@x(8aDc$xS1?UL!Mgp9DFB2f8MfGhJ`H1QYwL!O$-puMEZumkdq0@feJM3Zoz$gS zm}F)2(3J7)+#w^ph?$G8d8wTZELVCzO;g*Q$Pg(olC(w|0|~fML>lXJg_u@O=9Qvq zl-zmEq8)nA!^da#B)lx;Ny&O@FnY_eqC7QJD))RudBI|_S#=K6UNanM@oo_XS#r^@ zulUnAz-yUi=A7uV?( zVD+x^MtlmH6S!kZ7z0i%MR?a8L`PlM7*UXfrhm7gRq z0w`CidWR_&7o^!y`mvFdp1-Ld-3$cEW{f5U2yVMxqbmhKyI@|MBp0clc;c}Oo>$6( zmx_J@k#1-V+KkMWkV6@DbnE_(d3tMw*pxT?sGSrWwt=r}<3qR?`aG2;)~uv!7ZM#`kAWooW1LZepnzrBGqNz|HsiKjc_h8XfK|6HWBNhEBLTnH2jptRPO=E$%k1(fwwuO4Ud+2~?* zNo6VQm;&IY`#~&z1p7}Vw~#^9b(deUqAom2rvHC%Qe&O36?tjT0o2|2*U}o0Aw`T8 z%UyD>q*^ug=u7&@tif{tKQJ0=8=wDpFwO*O?@*-UPU0>u2O9Y{AcNC_-OEz2KviEI z40Eox{Ze&C(7Dqd5m8={A<{Gk6rH8t7d0aksx<5YO1W&qYOZBc$$C}yJFY5U%8*an zf1fU;M)n3(4S#OK?voN4SyB{*VMA1&k-P12+BeQ( zUlG7^Bt$!uNT7?yD36+at8#ZISQ~)(Fh+Sww5Z$s7}{25lEr2)MkedrTG<=dHW48$!wSr| zM|npU7w;cvvBoK=z`v^~n1|o819jpke@FwYhs26@$E^Z^lL8F9$X}9CI>MSFkmBSO z0OW#!>!E5L7WmOyE`T_f5`&}#-*x75zv*LHiBPi%(Z24Pd3j1hWBN~HP~K2c$(NK8 zA~@M8;2LVWnWWJ4o!~mh02|UR)DO*}xNe8P#@66Q`e_aa*YXojFHC@+l|PbOm&T0A zUeQCz(4^Mc?h>r1jAweHW|7T4e*`XW#;5pvAkiRlJs?Xp>cq-Xk)8B}(D0x|$*sr7 z-SD4*)hIJAo4$Gt4{|Yk_tSDzB7@XurvTsS1y@2#)AObRBVSReK6Le*zo;$+a$@M( zhT=m!vCZfC;y0F#mMKc%uQbL9qKcd#@{%qqvO0pSH+2~=m0qKfm%kDAZ8%~83J^@l zG0B)B`)1e=LD(V$+i`^dU*QAkaA2)btv|A6Uo7$0mVdIjfP=XI+i`{PS*7zpD~vHY z(bzKIu$e#C?z4%57j!AM#L%dUDCyKkw;JTK6Q!Kh^i{nD?ht_yK%J!le&1<55nB@J zu{vIQ({Y;7^RZTXgk3;v4AqQ~l6NzY7!A<;r^=(c_1u)hfbv6-MZ!+Dem? z4_`Tc0~ug>HGbmxTz*rQ!TOz|j)~-#>9rgA*mudnraA>Bp7fIljRbhq{AV@PkU;e3 zRhq_?K+)ApzfPsg@UWG%8^7^DL(v%?9y-ZK=-%O_Tj*C|D}8S`_$T8YEfb7sTMEgW zJIHBpr)fGG7(FR4)Z%#$Pk+#8cCJ|m5UXNNhTt~|M%#OIaRvBUN%N=2dXK#G0@Osq ziJYAun;78ttQU)fkrUw-MERy`Yd?B8uDCK>^vb;R__!QUiC(ZSsG9=HM1PDnj&|p> zoY8Hd&;sZGO#{sO154#n>mS(k)1g-W_*l@-F4c=@He+xCOt3jF~|mSFbdHstV?=%w#UGFExg{ zyNQl&vR;`S}O-)_GVmOGX|veNx!pr90y5aPf-YOQ6rL6?-3xk)VYX0);2?#}JG zTuZaZuItuiV~UrCIeXPV2Z$6X*Xnpolq_7%7FAn=S1f$CrS>;5^ntz{q_SGL{uT{8 zr2=rCvp>f&`=@I$y)O*6Qj$#Gd-`Q4Pz*6DSA|fgGmw>EQH-0o$emKF)H7V3Eh(*V zwuy3R_r>Z=>@}OF%ytu8Wb4(X_kOkGN?SP?Q+(?YHv2g7q9PY@x46j8HAVAgkA%;EC*lZlUETIoJO> zDuzCIHp-Hs-?=^%l$-ItbBVAV7_k5~TVd*aWR-|!Z&&Ht)w@>qLH84LLp2@r>Jy6$ zc}y$3*Dtt#FpA=sghRL21g^}R_bo5!8!jBTj^z#y#*Rw2gbalxpxA=#fH>B}*)97n z&$n-(_ipkkpPE)Vy!Cs`$}V26@XBS{*Kw0e8ZYi2izgp|k{ogOQoU9ealhu{{0*lI z9yoVg3e?Xy6-MU<=rjh15?u*_qrDZiS{`DO5DIr_$Cpx!>HaTJ#$kgUY{bjW{AMH%#}b7$Uu&OMpAbGf2Ae9;u6!j#sV8;(PxUZMR9;I$!8c{<@iGE+kByqL=3 zI`T`+eif~EfWAABD0f)72c*)=?IpPJTkILQ!Xj;!A-!7B%z7#eBy+pFk{3tw`SU1k z5>t*mPFr_R9|EG42~yZvrJ_yE8zAB^Qt!6e1K0J_E6LPaFUk||;CY8$lncn95(nV1(> zyfb_`Ra~JQv&o?f2u4$9)zg?$gBxYw1Ngwm;hbYLA8lj0e8*?*RxwnKa@8L+_@a&WJO9Ulxewwt8T#a9N=+V@-Un{^}|r1SiOlX z;W5@vJWbMC&m2ulK7=$jvg5`m0Wx7IK}{r$WmG!Mn9J)_S+8?_<~8}3d<%mA zEkt2?OtyO%AVF5&9(JXAP{%7}{^nt5s*fe|EA$4kWV85eMTu+!C~Ldid`p;>@9^Y= zyNqdnc+h>2N_@OrJw2E75HF*y><%c7hWO#aAXw})8r=ekRkw~|&}SDl#NU@)vz~X; z-Py#RP!H0HNh~&e4^wugW+3aSwot3qPxwTA3H4bP$D?I7XSh$=T$ZojaoEKp9L58fF5uUXtVQerzEk=*8?^GEgzKT8t#8Im_Ku2M* zHIq(RxcP^VS8%o^iFFU>bnSbl86wh``@=lj*ZfLXmu6$Wx^B|2v)4EG=p1owTMniIO z6glfvb+4xs_E83Ech=EOtvhwBi~r!V7*aFI;uT9<2QMwG>?!s1A5W2bxhrRd9U~WX zsLc*`6i|KKc-&F+%ql$ba42AkwaxeD$GZ!D*ILxPB=bm{b!@YL<((gz5zNbli;K+? z+F}e&H6)PDX~i1OVGp01$+(%@N!qE#TgEMK7c+xo*zBU{gz9TRIsEW7wP^(QR}=g)Pyb;?NH<63k%YruAN$X#^X5S$P`iAs zs3i7umJXHyvuo2*J8_n#S~TQfHXzmCXlh>2!4wNn(TYAXudfJt{U1T{nK?kCUP1D%Q#lJTYM469oR?NMdks(`| z`}#P4!ux6kKg++faeAY=g9tC$U%rf9rOsUzsL<)*FHP9tg|xNOnD?BJd%VkA@+=Pt zxGBEg*)#a)58eqmM8Je2qO9`F;btWv7KEwbvBO__ilkmiC0L z3tl=)=ZjX3dQHcvO!N$!_+g4?galm$Z z)7eft)+G)D1bY3vZ18*Dd9!JNY6COeD%l>j>17b)W_I2mcP+@M)lrLV?W~`a`FGjO z6`$R-!893%cA~A65_?^fzV307{ihj<5WkGxHyRGWCknMOwvoz4^BVz$FqogV2>L_U zfZG;sTRi{s>5iP$ADmX%`hQ4{BzI9(*ZiMcx_i9qZ0yhJjpSN6pf)^nn;Vpj%i3A+ zg}>Lm7`K0@VrDRUh1YF;uC&Ld#9<( z>+Ms7`1@Fulg)F9K&2UUFWEJaYubld?<7fI%4N>sYhAGZAnUk~m|u8o-zSrss}0g9 z7b#E*jhK6LK>tT7_w^FQmrIrAkC8H%#ifO44KCsO1o)G%F?1?yFSXf0uHb9+-sTTR zjT0g)Qd;2OW%UhRoSt0=STqZ|Ya{bIb+k$q?|#WVE_K=daC%f%tD=3$F?Q8Fro{C? zENUh)m-03y+M;=74?c!vyCV!gdNDdHdFi)*!gpiOb9%+ic0DS)E~ASP4fv<$Fsm8+ z>815>+o#>rZ$Sli?i*));~b*hy9I+P>ObuFcQI?sxx&=1?GLX!?r6I_0#qHa!rWpW zCmFRlrr0(e!q+}Ru4lHy54OnY-di!&iJg{T?7DkehYYF?_e;Mt#5cUXMS%w>RJq@ei!3q?VNs~v;Ks*N#CL; ziqKAHtNKI}%OiQiE$XHfB`(YDvic1Ho+Q`A$OAvw-c>C8$*4g|o~Q9BV1JAw(k;hV zB}+|h^KDeZZH~V`2ls1O9%N+u%^&|Rt4mpEdRpr{4^C$3T6@rjTEW_(BT@)IxEgqv z#mNU;T}I!1MEUc^(?my6gQ4|u+vMUPD!i24{C(Mn&x-R*VSgOZ6U#imh;ukVcLMd# zgr+emynAQzhwb00)0VFZmf4+E@A;HvsCheYiSja01=PGyH-!?juw04q7YyY+=}VFA zsKM|3G&KiL-}Q1Yr=}vOJ*hC~knlS2mI`Z`8zdUu32Dw^ZQ-uIvn%al>k4R~HB;F* z+n1siHF-{xfsSyz&Zvh*J5Zvel<)FMi#X#Eo)yTgzI&tS;qK2DMf!N6&(?WpHJsQo zv~D_2l5Y8S&h{gxxkQDBiad;;T-bVgRZhqhBz#lY{9i4AB$O^`Kk}iApRZC|xX{&d zU#HDj@q|phA*%-(Tk|6DHR|a`hOqyQ4_*LtOSr-b;&_L@o)Hv!O;tZLq`Ua^Mpx{_ z_Nu{x8FU^^v$#9jRvqlQ>Ke6F-K!;8(q6Dl9DBO4p!utnYVvdN{Q982fAIs2Xk8lg ziQsF$k-4(W(W5Hf?5pJB2p78FIiy5}PPRjB1!p4u^T}>au3E+vPR6S23V{}HGw0`7 z1MZe@3Gttx(C?;5xWDU66RVH|O8h=Q`=vmUqnr9HcC2@=RsfpHlcC3RMEQl!4>H*( z36taq?qJ`bfWKWP|h-c8k2Y>?ox+bFm zrm*TdG`*f3>O83#J#c0lD~<|TRW2Ut~KqpSe7wemH~D@%=uX-`LVq|tvmlA_Ag-yc1* zeB$o5fOGinc6XU#Yd+v&2Xn)7BP9J7DO>YfaDy!P3;wcCD75u_#$;>0cCE`|$__6s zHoWRB;iDCxXE|{9&c>sHWx6w(7d%oE63Lo^%xwfw>pSx_VB2DBIQmDcZdlZ+&cvs! zg7-erOt^BHlFsV4MVvR1ms1CZTTcq?7|5J7%z#-=CPRsOlI&(0v|9rVE~FaThC#kQEkzIdt^R7`tfP((e=hgBte#LwX~%7j`+pu zK+gCHkCczRDqeJ{WIP}xu9I=NlaeJGL@*a+t?~r48j0?HH6P`Zb~qhAEdC)&ni7Hd zP9c$JJ27caau%-ctYJdfGpEW%i3w-rhG^?IY<;;P$}ks9tWdAA+{LlwOWO&RJR06x zUhDEvni({(RsaNqzH%bC;}!afice$dR)BNQMIt3X=!O3^@|7nVy3qD*`h3sf5w~A< zJg~h(xox8wrV$gBHS0W0^IR@an~b>#XfzT^ebe#bq=pRFXz%CW9A)qG6z=+`$_A5` z_Eap2L)xqciZwK{QPjA$>CeJA443MK2N>7*A4lf>Zu8)tn7^ynFz#GZFFCdE>A|a- z-0?0d)YMNl6lsjx-b=wJYf@M1-a4FVaCvARfYI!lL7n7yvx#f#tP&l`kPcK?Ef3JA z3vsc;&N)R0`mGvpp<$MPeI60E($OX~_|e~UFwgns`_PVm-!J)I!6z=)r{cnTg-ix# zJ}2GTzH2K>XmlR6`;j+aCqmZ=RJt<)zq1*6pWuoJ$92z$r!$}Bly;A;*Fg9LFI$EB zBH(v^S1ZGHU#C8@P#GQ!i`E+cF4ti((({TJ?6l2!v`gyTA5Ka7@yOqh|HokiiV|$2 zd%^fymjNb_LvVYP0#hG~%+MhTrWc=yq_~luo^5mc-yszeom!>Z z;FV9F>f*2;w=8~7ns@wfOg>f{L(CFyoej8F8oGuHQ87jO z?=pjX#^O)Wvrj0SFRM)M^!~vL{<<=zRmV5k4;wR7RC-+61W@=Qdbuv!P->gk(k)&k zqjwQT&9}k6N__)a-`m;qUe#c6;-esdq2xjh%_|Do%F^RAlYNt>p7!ojw2R2e)yy20 zq!AZDyT8&kBY*;D&~$+5Vy9NCHATjvsR1qEHU5q!M$U2405y^7cS!*`{T5~ySODL@x?H4H;avV zI9F;73V~s9n5Ul&W2~CW4MIw}z#Amc>%hmA81|d=9^0F$e z$se0_32c7Tn2}Jl^B(kI@jXc&%rH8=X!*%O$|KoN8V3;wV^{HLH+mX(0$xswj-bXS2GcgEs;lTXyxG z%ewh^0IX`>k_3`Ss&~tC^cq2>xbE(n6IG-yWUS*&Ww{FDn+EWsz~;TsJ5?48bMCcI zv?f%v2d`IjgYQ}iPoG=v<~kPgKh^tsZxvrw=3s|1equ8No`6zLTtf;4_&oOJ+4xv) zeUt0p{?ymp)meJ>_x%sA_oJry?{OS(x!=cre?QMnCy3F5@p0?3Z>^e-f|f-@qTa(D z(o-CL!8jsxiOdy=Efz=WiwPbco#M-u;fC^nLQO=6cqZl0%MR?apQ%o<63O-l5 zcWV`-L0LFgife?fK^+{rdrd?*jylJzZ1za=J%b4f2`V(mt|Fkg}zQK zl=M7-jFC}ERSdY7^Pzz80b$l9`(*GnJiv0a=bn@or^r%E$*S}Cy1j>98z`BOXIXvy znk4P2f3s=}0$IT}d4193hevf7;p8pxo^_=BymBh1!fw>QVwGpp zT!an@`#1t6fwrhH!PXi`Txu~e^KN&^)|ykT7^fkj=MBetJx|`>)>U~}Gj)FdDt<6j z4;KFbgNM!vW0Udilwd$Uf2Jw9ud6vc_e+3ka6?fRy#P@ngQN_ZK+~% zdj!YzxVu5~J`FZLY%2IvaFN;T;jz|)a(IT~{I{b2Y&_2Kw6Yu)Jr77#Bds8eFsX$C zRIS-RzW(Nhrlu&5k9UdFPlJX-WZ(mSWdbOBj-|(gTUqXOGqk848wu3c74-TK#^Q^u zUh6S8F<_{Fa3Tm{YIP@J#4S)vQDT#>g>P1;onNz+{Y^oje(E4~2h2o`4y-EzhteTq zRY6u)6|VWY+K>~eZ%6Bn@<$8IC|YPEzgVuYs>$jxzRd?~%pb{ewt06MHCd@fr7~I$ zZ$SGnuxi_l-+FIP_)Ka>WFt4@M36VU_BcEFAfBsucE7w3Y|Qg6=QCCYAS$_^VZWFh zn8@!4=jLN|1bvAJ(Ri6sk1y3KAHKE|7Ds=#y{c^eMhmPy1--=FtDk`jMWku?!SSnf!?}m62aCb$EgVevP84Z- zX8z8$d~^?@I$G8HABlsYhsVb43y^KViIfj{H=>y?>212om%7P=;Ufz0p&gj?>XS0CLIXtZaj5Di zFs?xuS>5AAjE_^veZB18;7;5{$B$r@lk;+OEWF)^?4P=yz+~9p9`;^IlfXw^ZIk7B zGX=#fGcrD^h3nGJa@W8p#eU&T)F4qg9Wh)#ti0PKaCQqfsUTDY=%M^rrF2y`H8!;^!C9-{l`=_BHBKYBFCDQAgJF zai)BuZAF3s(_86bA%zgRNB>AD0IibE=Pqh{Xn}1vn8zzdPi=h1nbjGYB$# zJ^ey|p23BK4q~1RfGN2r+WaJ4F2zUnK9@-UFtM>QW&wm7wg?2B#Encj+zrBp1rHVd zO}!C*drp|`t?(lAm@Kbk?*mc5@{M@m!M2+)q}yTYPTU$&%BXBoK6xG|LDuF#(Hv!_ zl00#lFU2VG@sh!X_uCTfDlzll@IU=3??s-^Hdw75uk<*0viQN+m9cID$@maHy7iiQ z36~|=CeEwG;$F%c&%c^$v<1sNWnZ1VxVn3HG6iHBp8gQr9hFdUq?heXD|mSliE@@V z%xtc6@)rr#kG@4<@7g;5y6`i%ZO~z*|Kec^Qs1{Q{+j4MkP1b^2t-$<ERm;= zXV>hUY?*>AzgwG%T}-t1I)fuG*S1e>vU8ah4zrqSV*aBMYMkC-y&QhUQ29rl5F4hk z*L%eho)RD~7kCn`Wp9w}w#a{$xp=%0NCjHw*R~g`HK=d=iARw?7xWk$VCnK39e;jJ zr4I{ReM6#-qt0d^8}U;Dok@#Q!znA%i5;hTv==V#G@JH#?{|mBNQ>eIJ`kC}nE*mxvlPT^ue3@*>AycyR*G0Z zats4Y*W)kryDoiVlTBs$R^c6*BDOUyj0I2TMiMy=RgFm2_F;KWCP#^T@`d{(7K5Zi z*dq?Lx*_iKfZ+Ltrb-GJ(ZA#J%v5&j!O|B*F5E+ihX?`f;}ryr@VI@#p^IitQmO1T zp%jwI2pNU+bpviR!)mUn_WVE9sYsUs9H#yoatvYMp|ckjDmQ8!fARopIH0OvR4e=0 zpSHxvdoTZ9Ae5j9jFQqS)MqD9)0IH8zuMthlWm)$nwHq>qa!z7ZUoKr=+6`}komN4UvyPH&&v zCG%BLa&q)|34D4z3Ju;b3~tWuYlcq8>DMggTHUu2M0}ZxpBoFm^=K>@Z~Lv-SMG{{ z!dFxHLA@2j_Ll^}Gx#xU5ou`rce>MV?jB}0Sw-pS2E1pl9G!k~WnaqBXzQMmW*Y| zDR!I!Bn8S;%GO*xqNtv&xdkf5aa|Ct z)E#{e3h0M+A1{a0zxOi-)(>lh_w;ymUq-NAT$3a;ifgBZ!7t>wYWA@}Ci(d0N(gkaEfNPGEXyKiWu(&?EZAxA5jIl!rkgB_ za%Vt5wT7GHH}V_57Do?_vYx_th)|A=Sejnno}_CeB4B?8@_YL*LG~EOJ|&}I4TD;B zr>KCeO1I3TvJXqNc!=LTef@RMFBH#2x=8GHgai^|UI)JHVW}ItjaL>w>%O}Mr5JQC zIBGm6l_7~<^>2T;xC0M$m;4qZB5uTxE<6fi*3{8#3C_xs1}7!xQ*l(6bW*Ol7;tre zAB+Tl)b{-r8Z{;`E03=n_jYco0wZEs?n`nBMnuce;W7KIK(!_P509)=8*1>atIv62 z!iE2{PhvohWrU|%Ux!6mz!$NYSB&hchK&yXj_jC8s%rT<=IX&c`<|bRy4*DwcJ8_a zA5ID;JM)5ZOr*AI^f*rg;h^lo@&{*({o*bB8#%?00Wr|n{MK*< zFUw1@kg1$kyBDXvcXRWeh=J!*$}*yPAx;Fb3H{~myoQ=)#h)fqBj?0R&&Wp8*jvxe zFu>u}GTY;=2~7QzsqWR59|EYl+O&|g6$9|p>S(sl#sz^K1|+lm5z=83hP0_~{nN}) zph(%HznHQp%+gc|7_#>C`#bu@%J4$aEJFtm-A~Xz=IW4cBdlr* zO*Layb`gj}?AD(X@_4PwK2Ty z2Kg<_=iR6+`AY$WPR(zf{)Rw|x)BYU0~4--f*3v4_Xx{!Va7iko*gTf-m;0IyL~NK z`(Hi0KT8jlSZuj>tk6oi

w#hoNpK=k80>fQmUhW$u0f=Ea|g_*G7 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 a_aUijzvn5jd#;3^k&}LOFI`gS_5T31$KwM4 diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-night/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-night/smartthings_icon.png deleted file mode 100644 index 6fd3d2dbff922745e172b9a4c9d796eb0ec061a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9513 zcmV+^CDz)BP) z33yahw(tL^s*+UZ3PZ?562>3`i31{v0(Lh9ftGHEhstZBt^MqGy@E~OR&WZudu?9} z{qWhgw*7S*uCyX;OSqzl*cw1=1cZb^h!8SB!jz#ZNoA^G-*2DVCtVb&Gt``9|NQDB zlEXQ>&e`Xzv)2BvwFE*4LX98@G4u}rQ2=x+R;(Ddc=7#{dU|?vcDr4dmzOt9%aFRd zI@@Y%>%NVNiE*^GwV8kLgYO>$(9M3`1HefLv4#ALayT3gN0y))AwdwRp^09#YE|m| z`3nj%GczW|$0uaP$H!09>-E`!AY=#Y*iNVOsKeoCZEI`$%3`t9S65dbDJ-0Om>H&S zLWm<+$L4T29F8(UF+zeM7y%e7Dvm75$jF$Un3ygxVwWo6~_ zf*|~j5YiUeqvmipoc@bXo{%62@f8(E?#;`~ThpICA0?<~v}ezr=L!qwe#zI2I2;Zq z@M!XcsQ0sK)vBD<*0$G-M&rDJem$sXbjKZceBRJ-eytz~Yq(d$;cz&CMW=ReRBHX< zhuda9|NINP27>`|XV|b|zqDFAwm>j+~KkI2=y@MpZbD8lY3BPX9b7Cua?S z1j6 zS6A2eq@=`q2_e@0`3*Q64k!G0^@IdLh@&dFa2ufdjxOwMXvT@w4z$@F7#?H5bwd*I z{j?!Si1Inj$#1AQqo$_j7lI(X$ZODXI2?{|^!XI0VYrHlBlm?<1!w88q52X}poDr+}2h|mdij8_^W`ghd!{2)CAuilV{C|!7T0#>Va zQ%Z{IAwo!3SO&o1a5(*#t2`lE3yzlJ36}xtb~y3qo=ViVbwe*29D?ylahQ{tf|O`I z&RVbe&D4skfELR~uK7R4uyj9tJ2%2V3H{z z977h%`^3k`%^`$zgk=C64u{iExgv%|y&zf*J6r~c8pM*yi*ORaL4cp-W#EzVSFiab z7z}vj#&IYx#eoo=xb24O^Whk>2rcjP;fLF%hiw2H4u{iE@mxrWqwN^N^;J%_cH)Ay z2XqN2N)YhaH5p#FHRyEsm%J?KK>(t|o=cXHj@6SHGiE%(+Lm)T91ce%R~RAMkS?5( z?6Ym%pwU5UgeD}%A~{-Kf_=k~1gcjM*M=^2+Qs#xa6y~+tzNw*Eo=kea5$WPNUss1 zExBn&)Np?V9d&G&AyPtsAcpS5?cq|;g$o+OeBglx?&9TqIGlco3BWA&$>oS%uek#qKXt&vAw?EX}CWhju5lS}b5u?|KY^;5emX=11cyw3?!QpVU zQVgI5z!&UO4WNt}CQgv)H9{2?M;3*74fxA<7vL!)@3K4aZ~LooxUn62;xb70WDgJ9xZR<~JR%0d;ap8Fd&8f_ z&rL7OWqwBuQ9+2uGw6_3{-YBU6C*-mym)*nwpTY{|HU>qodTZwx)z(O8Zl>N3WgY? zP}AOp(%ME`>a;QGHo>i_iMS&@B?3lIOZj9>7X;xi5!4QR5xbEJJi-fR0Ojmc#{Qo( za47IBx#@1rg

7RLWW4{qi5L+ZIa&aN!7zgvp>R>e7Fm~R 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 Hu0mjfbflOJ diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-xhdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-xhdpi/smartthings_icon.png deleted file mode 100644 index 1a71048e5da0d0d59a32a208a53b6f467141420a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30892 zcmX_nbyU>N_b@8mxq@^_cQ-C9-QC^Y-7MYR-65SzN_Qg-(k;>g0xy1lkMHLX4rkBI zt+{i1A{6ArQ4l{NLP0^HNJ@w*K|w)lzWsj;5Bv7_757L33W@|uQuK?8NA_6`f(Q0e zO3U;)=qZ#!I6#>G9WpMoTPKy6Nj(-7%Rv3^K!oubbMD!YCV!HQS#;x6-ekP(=UBqt zDefpX4HM^18R3CT08_wZccf~-ovxMZ)@%D>8Kf#Jbs@2`vI^33Ur%4LsImc3)xH1j z-s2n_uY~FF85nNU@#%BPS-n6aqmrsr zd_U3K+j}|&Ge0-yWHp_;(Xq46L<-PL-Yp@v`}hxz9hor*ASYG@ok9RmZCa-pE4Ye~ z_qiIYtgIYQ&QCm^!meULWO}+g_jWvSW{P5zX!u7;Z@o$KNMBzhrs~zr zFXE!|zubfj?`oz$rkZgE3jeqW4rlCo{0RO3QOc2@gHlENA}fy?eI9O?qKSpJwR*Pv zRZp}LU`2RzAD^D`1YA!Rl((LLy63X*xd#4t{~xuzip5_?$iO4UhM@7;T$cvlajNQvzv4(4T41kQC~q7=uFI``%XRcOmpic@-it zIv-AXMx!b0I~-FK618dn+p;XH6;7{%N1fLnR9<7Zh7$!~fUpP&y^2)W6V`pgQCisC zd^r^-_PzP&zH!^W+sU_YcPy-F@o&4^wpBuiNKkUyj(SZBlkah^bya0$_m4}DQr>(| z5}5Mhb}G4SkBJ|4$L94VXovq4Js_n`$;8mHBtE=TO6Os9sr%)!p`n2<1RaEGLF52c zpm5~j>-&6<(ymR?@()!Vwt56T0YIg204HVS&Y1XV*$NCDSfEfKDl03C_Gj4t&yxsj zeF==A=)WBkLpWqn=)e>`MzxfnWas_0t(WPJsHmt57vcE;>6yXQ(Il#kX$CbO?bQU5 zeKYT9-pw{rNFJT59#tH#31W#APje$xEo$6$baY}Cl5Hk;S=@#odm z6%%j1Cds7YgVx>84R3YV+rqMN3CaQ6kgETWQo?bdvdak#o>VHu+jPEE7OA7dI~Uyh z{tUSPThXrK?k*Ni{i_y7tS&)2Kcs+A%dt+) zoxl2!+#PBFsz2NDaKiuXpb(MDp(h|>*K3DMjxzYWKDhV2QiN0UQM;DPr~_Fh33y~k z@*e_b0vaq$FghgxQPYoMp_fr*9v+^Hp_TV?1#NA=d~Cfnai2(m!=EpteE# zxO2i#nHlB3)&0yhna;8+*rpz!thg=W|2R)<-?<%%?}nk+n%sax_3x?*liA>Cs(6}B z_3YSNa5qAlnr@`I>3U(B2zi|LHrt&K`Nc%LbbR4Gwf?a&V30M^hhUcyJUG9;eia-P z6qMyi8<55Av^Qb}(0VVr0A27;vH=*{P7Oz-K-!*=G3R%IFl`BVY-ZJ}?+cua9CHEU z$-;2|0sVnY@7{pxTt^)^cyX^E;*7Q~qpiL6VRtxfD~y2QALi)gddyk``muLVfiT4% zDzD|Jz~mSuLEtL^OGRbMw+bPHw8hQ8!Q~zrOy`JBdmjqK`wIsN}X?{NK?E z9~fGBd^j{5lnw7#5%RPu{Fp^P&J!a9Vhz3enrOE%QNH z!Wv;`>^N(9;t`TYkQ4leoTxMe34wGhg1V}s<4`hh+MTq9GCrcIxmkeO&!=7LZk@E` ztQYi;xr|^MGNdqsl)pF14u>=Fbl4BI$$b{dT-#FKn=9x1qKrN+Ov+bJOF>CEErzKy zBjh3DJ0;ET!(m>}|6BxBp|jGMaH!iqO*J7f257cr&VXG{{WNYz<^8T;bbxoiq?Gw= z`PQVExLW3G?(9zBp%+(X?!Hc0NE``ac!G-)>4|kU(#7p_6=bBxBP$?H)RW%Su3%un zZr;O0S*_=rAIDd;h5wIgRya1%R3oyni<6U=uUi*Ah)c1}1U46?9r^;I_U!Irce@-W z-xKJYsDsEJE9E8ny~7!4=<+XArb{hh+JF8;4>Ky~T%avEo4R@V4`P6fflP#bd!*D$ zx9^jEP_Gd~7%${_OP^1MuH|Q;?&Jo>QY0BJS)`SzBFiAwgW^m8cEWwR|3h4<9OT8G z@7UU&pkP;5z;Z@p3K%l^Rr|ibf)3Q(~VV z77#EJ05XLteB zf(jPNvJEG(WFnE^jPTaFUp7$5X*0P_rtnaqKqBMd7n77ldmDRR zYBG)zNH0~bMl)yWyKwv`i1%^x0qW}J9HC@{HT~t8qJF4t<@pnTP`B$gGNite48@E6 zwmfl)hi4@X>#x1#n1A}G`*SH6QS=V=8sm4Rs9vvZ9nHQ2ys}dtwXp3oG(?5EY&dbu z9>Q#v+PeiGZ=&Fia72y|zv(bM3g)(XVN5bGI{1~fL$&>l>i>Qu&v>$OsXnTifcH@x z{B>NJSd_^nCU8`e=33bnl+RAF;8M$V-3UW7T7ypLXO5ISc*%zAUSp z9Nodny&X|C(E6`)!cfdbH=;)<`~N4BoFI6HQ&UhrTl|YiPLoyeT0F!TOJZ zxwvA`n?Y31Ankr!tlgvlQ};C+FxIxZ%v#Ip!ZJx#&lK`$y%=Az)5?+YTX26qFq>Bg z$SiJhBp2|yjDUWw(7zr|B)MTV?rSZVEAAK8Z7pI11ZRqb3AjE zPn{s*`!T_X#;^c1N|dM19a1ShDShnt@Ea52dH|NlIQmAwz{KfZ++aNy35o(#DDa_C z#sBkN@nRH|4GyRg>uLIa`?|EP(2P*mo?Y!x*EQ(g($Nu?5v2f=`LYAmOo%=y^jA&x zq@hD_4hy6R^wHZzeEjG4sRAzOL@~-}HBxt4E+nsi8O&UiNe(^FN!Q=t3u>x|J%Bhjzj8=-z-JqTt&WEl2_wK)xw=|y)k-;n(0 znhf~*Bk700t=t0N9U7|AygqC%v`ASb%*B(35Hd7IInl4Zo&_DXVDV_JJ_aucKotzq ztBh>?O=9Xq{yA>p%=qXekT-fZv*8Y$v~Y_!2jL+eI?(hqo2lBWOI`3q@8sqQVhEPG3_kp99VM_-sEXHgA_ zj!m_xt+RR6%>C7pGE*?v~bwnr%_z#2xRw(vcd{%iDeV?jr*ZzTO zo%hOjb0h*im|N>nWUk>E4tY(jBMOm0F|yI8ZBArzoaUUcg~yZr1s`xD0$;CzKquN168@8{uml0MAu>D_ zYu1ZQDQMhE2N9|*%Mb*>q20Um0POH$1;QzMZ@t&o`f&%2TcC{AIMdD)^HnleX59QnC*_Ab5;kj7In*{%e>?2p&> zz)~%FRbDlcQ6{||s2jVR=J(L0OkVP!$gnkG*aA}}IW?)L&$^1FB5xr~vh)O`dgy;r z=~dG(&=d;wr8P98oB9Ox(}bETss$qG_Xlk4X!q6J&ocM3ttc1(;C)kgefegM@1Z@M zO-kX>q(HKr3Ps@f4L>eJwb9F;hb4y;QjL)R!PJRGH+sZ{0pwVb4t&xd`B#`Y`tSqgI^zbelc=7o)9dZ+1oXz`jA~IlGqRjTq z1ts6f@*0o0LwBIR$v7I?5QAh=!+K}Cdgv`>yJsm*+Q-WKy_dpWcIU8PY;@&7S%6yr zLfarMtnE~g4_k%ET2D_Mpgw-9Nm?c9?7R?-O$AY+YgPmI`IJ24!l}6g;@;pw;S%Uo z)Pg<+x&-LbkIV97rxck|GNMAQgMbMj_=5fLA1743u%#dOXFAMM6C@~_a0wW!^=isC z1AnCBFMKD?w?E?sY>Jx*9U?IdYU)9nI^oj-LOM@%FCYYRf0Z`_T3vTVPV|0fAeh}K z1SZUAknDMd%<*DQLrME)uX{;;J-dD&`jivngqM-5Zql6WzDVvK|4({lkT&EYfX-mGVEuBvQ_!mWBW^;n<+FaQq4iJIW(vwreE(-1$8 z(Jbnvi$O{Q7O4r9!UJ7*-=F9huEn?Cc+qoZY77)jDX{!^y*WBM&{q#@bHiI2e>HG? zph|~=av(a>)9mN@Y!e(pxYrckz!3oxh?xXtrm*2ab0ripdDlysP4$*&A(fPrTsvZ( zQ!O2qz-9(_K(V{asS3)Q8X8l)xzma;(By8$CYsx~ zzA-6)x|lfvem3pP9Of1R=?PE8E-XAFRDet{U6Bnl58jbPdTb}t;kzYDC@2ky!fg7? zUq;jnNJ_m+wb^p*nu3X5C3)9ZP2dd%><2zYbAx~rx#n3B@9CNTr|H>7l$-@Z_>c{n z(0ka2j%d0S`X&d8!jp#gTJEDZ*>3o=AlW_BdI0GFA}Kgir&~FQHWPiP z9Nma=jO9HP>pR!!{l$9~1bV1qB#q*Cy&wuq&89GZRV@G&tE&!gefZ0-?uXC`JBYQ^;oG7D~TI(qQT+>?yE%PN})uA>3c_>n$npZ~wsx3;CEULBA>eE#{ zH+Y;b^0=0`yflgmV1XiaW>J7E9uy5zOv(44-4>%PC@7=|49y!K^ufV5`$Yg&hkv|i zoh+Hw=TG^(XKIOpKQ>FYLqJym9Siv8uP*6epUacmqT3p7hJ9e>B2<IDt(X*T(wudJ-3a7RoP za<7TM`fQs#KHq+v$upa$S;^zVe@Reuo#K&^}WB+8z-7k zIu@5UpWg)O-rUp!ynedi+uEO%2F5Q8q{MS>&q@n~5i*=`l+=_HFkoH(aWMs9blEx~ zFl6Zzruf26^~V1JXoiU+AknwBH(V;JcqAbbYki|Lf`a;C@IDc~vGzwfU0Z$`)+H+2}~_*U#QucD*DMVy^>&nvy?@ltZG1vh>AvZ^ac-&9U{ zML=w;!J7q0`)KO5!~>{Z>Ih$hO)$kSj_55^p4=AUP?Acv{cDDGz{yU*Gim~s=hPx; zOOiAgK;!^v9wr@&%bh`Z949=zxUkA`#6nN4Xv&O-L(II7@1y!LfJapD+dy)#b6s)N z8@!3w)KBK@|EtuD7J>m}TKs(k41D1hc+hV$lkH3zWOM(yK0bGu&FOxxtgRo8*ubxn zdAO7~T8awJhp zx10Euh%9BXLI!Tjp|XCX9?AiM;I1R_W3XD?QDS*!KJBv((mgHI@fT5(*(6)9EOZY-ZPr*!`WKiR{lZ7IPNLNc!!k*UI z-<1%fyFeTaz+oIvin3l=T>Zk-;xbp0>bAPIDLef1egPAA29-)jK{8PsJ~Ms4sDek6 zy^K4Lk(RNTZamUbs=H&#($CM2g%+6-jVgQ+`tnPP=V$o8WvYNDgL;?;Rj3j4XgR>S zFZ%1A>8MSvmn`4}Y=PG8#D#5V zZwOPqZ`aHw2#r`sT9EYUd4KTcBFaozvxP64F(oDCBl@g97@dg5bmX0^6R$OEabZZM zQUFEUUlBt=aT64c6n@S1<|k6;(M09Ao9VC3EunJfQufwYNWuhWYJ)6*NS7blXA*nG zLI9JqWF?=)sJTQHFuS}OqU^j}h#9gpW$2i4g%@#PXape%MX~+X+?*S;JD>F|Y>H6A z^x1-T<>6-xB5d-z6eUP_mWZ+q*K%>jVoi4H#u++;W!mSM{d58ls~gCDMM?SdtK)r z1_7hoz-K!NhK7AVEF3>nZV0XVCi{8(LWUtfzeOLdo54Jth#<=IyCI^{ut;FJuttVH zrt^-S6S*xrUP@zp%Q^^#@5J2PT5>%;;e>{o$Aqle?f$m7E!ip3j&Ym|HEH4?(AQ-f zJ9*b1c=BJ@qAeVkYW%Hst)u8Cwol+`rBC;4FwSyvLO3&kSyP22`R8Ol8}%(5mw0`0 zhy{H4Lc>8dA{>5{l!Z2%lcqMq5H+Nny0n4{Us$(BF1ihFEkaGosa=Cb5(!-bZq`D!$sE=M2qSw z0Y-<6?1avzN~vkpT|5;h7r71BktmJhK&v=)>=&&kBcf@2lf2TA$D}Ne<9*ghqA9XP z-(=0Dc&x&~VGoEYe;W4%T*&EOOUo`#iQ!+_xBt`|-2N6pdnMW{u&nvZXnDu*Q!`<~ zjNzPNO)}z6O=H2Mf^$hy%spb!$WG)$zWlju!G)mmG=jYAb)-tp#17&hx7JR`TXn08 zY^AHPi-XZUYV2@(e~HNBnBG$$=%2+~96&FWn_a{q#o}KLAn^2)(wa_%os8h3WdVE%0dI<-8$x3}t(<&&(?{)tPk!Z&@ z;EnU0W^42r>B7tmtgub(e_ea6Ae z)zb1fZDKtzqtmM}$!_bHm?!~hq#*w_%fO!)7j^L1WTD?dnRALa$X|i0d&_uPO#;ib zFBXtv-(&r$%Rl#;Xbgub+pa8*zn+Nr4bbp>iYS`oBEjzqObka#AZt z<)J*#e(^#^M%FS|8avx9v|-Y>%=W5ihgFkSVdzFB2*8Cq6KGy3EnmBtJSr9*vJ@9?75 zY6WTXrnaPEJ+0~F2jZ^$5>KWT?@I7?f*2KIBNMXu=nN9}^{_a*CJ@MwYAfwo43#B` z(fmu*qQAlL;_@x)YFU^4NGyCx#9NvQH8~{n$*FEKI9vY~rP7Sc6=tg9YdVK(_Ry7f zm`+Cz;TljjPY;fM&@141t3>!UYFly!8if1(lIdzuHI`7IfDJbyWH1d`ak;G~(_(Lr zH%mF3X(M35Ir#0nKRozv7NFdnM09fF!(Z>|mUCQcE52IZ-K@W+cEm4^gv9!1H7?IO zzp4~x7VLAF=|{n*)n~||=pKhfhfH{SRzQ3qFxV6FO!p1FRUoj)RLc*rs1jY|3G!qw zBMEyed?a7oE2@)7n0r52=$kWjeP5Szjj>%Izzyft>Z?pzctyg`p+1m%UE+(H<865d z7~M6SZg?RKO_0m%t1y}vhrg!V+c~AjYp$pdIp?bQQJ5{zX&LukO{Y)c5}A-;DUpie z%M)3Ljov0lc2fw}sGNN)M(^itVAVX_rB=A#x|OoP04`kl4#vXWtN5f&EN|8AV#UE( z(+is4S22+eh~ZCXR4lXGeR{HDV>+T>8?LiO#z&!-IlhPOpe1J7uT8i!1>QK2o+HdF z2!40;xpn3x()uD#B5wBGRh0bHcGe4023MLalmvYZ3^h7Ee=o8% z-L1f$AdFdT0_H^I`gr6PQsr9i=X0{q=5|{roK5ByECiDrG?Eo996wdEU&Fn&gnjaQ zpWqg%P1D?Rib}>X92s_$+pc_c$D=%wC4oFjnyHvBo)$y(xEw9Huu7cI)D4NtwX_kE zx4;Pf!*H^1p0#?^b4OGnKb>`)PLwI=`^ax<;V7(}J(jK>imXADS+wwr6r37!X5g5T zqX}Q1Nu}Y2>Z9#3qb=}#G*xy-itJ|BA!gaA-^7b~;pKay2#IDrU{(XAdRq;#J8@&-*_6s_c%JQ9ON`a_PW5c|W-*ewRo(su|W>Ofxmn37dTK76Oc^q<84MwED{M|+L z_?t56Xq;nqpk=6G`mr?l&*~;ySJRSR9-k(8GcB8LQc+C)dx&q zexHKT1g56jG6&S9s2z;#OnKnC={alp2-nd;U@XNz$~RH661oHlLUN!yIw zFX}%g(B#*bEz5e1_FC$rU)}O+sKTPNtYR-SdClc=j46Vq&lTa|>BVjyR@K~=C}Lg~ zPL3Q3{I`6JH4JPji|LlNn9;!ZD z_Rtl8kUA0)lg=tl+P0T^ZUz(?0xOjj_T%JT?=1VkxdUk$!ZUG2{=!Nk>Urc^)$1bn zolfbUtn1v1wco-?_98~e^!1oyP;1(P1bL0G%I~go1{;riUDIa0sZy-^A|L0lpu+r7 zdur`TB<|1n4d!NJ2y2(BggPIq*W;pCtb6MgLA_N>bUgg!L$-9+e*!u--rda^wK&<~ zj_w5#e{SWo`Sl${KFoi_yZ4S7W08Nho;}dAavMjXL(shZ3fd+FghCZfK43h$OHUN= z<;SIEmB^5s?;rPt_aTPsKI?|N2fA`uZ{h-Vu3|I(pbUnX6XJ~$Pz-(gas9BF7^#K^ za`%sa@vF-qL+~=?)pV+8wi68@3N8XM!F=_2)TvT~ ztRcLW8>ZbwMY5wbtEgMF1ty!@c>|WKvWc^$!JqAZ3 z8}`V9)DyC=pxANm8>$95s+>prmU_MLh0O6j2Ei!7ZRr!a{}5Tw?Uc%KyHBn+Lf25* z*Tak6AB}xgGj3!S{6xSuECDurH*r$jV&-VyaE~Ov?mk>^H%^0y3^o?WL}1vxdTzS> z-k!Y6b%Fk}Otv&C>J6<%=>^RV?xzd_o2RAT~HQuD4YMy?RNx(jKzsXc3%4`GVPll1^W=BaZ4%3mWrpz zOV4AG#eJ6842gZx&HE`fUzfs-++SHWFHpWaqro@b!*28Udi;`1*(b%h!t9n2vt5Nq zA0xo28s@S2k9UHP`9C&#``H2r;TfV zx}V-ivb1Yp@@V<_jp5-W2@u8kHM&**&iG97@f&kp^IFCGC^-&wSst`7B+-aEU5o9o z$ghlApt*{jFtR28*azG*RL$jV)Dp$O>utD>HJzCSL(r4VHwSqqh)4cVAVvskR-oa! zOTVk_9%mUm18m?R%6nC^(41gVqMg4(ZwZxZs6&BlT?sUyB2n3aRP!|l&((Q|9 zdG(tnyDAR;;=0Y8J}enbc}P9$C}hs6lz=FQc&Q_^ zoQj0p)3Aw&viS%>2W8Rerp1$tfna?W)Ab-c{MU>CiRJY-G05d~hvn%gKsxr+#9Y5v zAeXxUaDR%4-uEJ^B) z)>A8an5S)(>gx<}f)N=WMRZcJv^SP#Kid5u0ghK+@n6B8j$uvb#D8@3rEqFucS&bz zII}(}m4AMK@;zPIWqCp#YPSf_p~iMBQ7E<@s+1T2MzO3*4yRkF`CkNJFA&4e=1iZJ zJ?Zfmsxq=BVQu&(Jf94cprB@>$r0Oo<(*(ZKC=rj@s;+B{D4<_b|~HADap>!yQK?R z$Y?sPM9z~aA-8TH$Xz2Qsj7DQ^T%gcmtD8Z5W|?cz|<+Cc~wExF*OxUY=~R5kGdeg zeRv)2D(Sq-W$obk#y@P08ar~UEI*&L352D%a}{}n8ne7k_b0O$oD%kC-M(y|6nRh2 zHTy4v2;W`DHn!W7)Fdh_%b07L>yyu|{eezpzh^LTrYG7h{jdYhLkWR8pG9Ksd5XG`B5;_qM!Ty~@ zY>5{|%|iJQ zIlqk)@~+6eKHeyv5W)|FZwBBQ65NM*wM5^GON**R{6X4iCQZcF;?6_r*)5qrZ`zsm zmO&uALi{3TD^;67(PX7$y!odNn#V@!LY_q;@13}@+p(#x#h0V_ho)`rA<^cH#ZZr{ z;}%+AuTC8=+PWC+aDt3{5FbFvbyF=XV?O#Y)NX=dk9s+yW1*0-5&dvZAdiu(<2!D`|6h=;g&6|$)#^WLD+_^Arz8dH@=6uHQnAM$s@cY zm7F8*10uc3R)Kf%J4UW13ILE(rZ5hc;i4$i&`CsDTm-rgR(ab!VIhdB&*l8n@=>4n z<~y(WGgZ<-SXVwOZ#BesG!=a4g{8Srgr`SEy0RNh*E%0L?qHkGLo^03VGX|^Fg#ip zXVU|%VgXE&yo=vOwtkBX`0hq#81ruG*lTQthZBGp^cl9i(|K8qV0wdc#^SNlbJNJx{ahvknQ1ga=aglvy_%6<_Rv27yyq zHU?cuGCCEUd86T({1N-Xr8#e01_yvoF3NMApiy|}yn8F#EGE2QXmXGd<(|X#Te#(} zbElfrO6Cy?f7tw?V}f-i{XjxbmXMK=mKALTX>v^+1NGZmPx4!3iK5Ui0gNSj6?da@!tFw>pD-6{WM+f?`ERqMzq-|Z(+Yd7Ar9*{svqi0 zVKmj$w+Z@Xz9a(l%~s$r@ppP%#1*C6i>ycGr+!bxde)zq(B@bSzQDJp_i^9?9m%oX zIJb~y{1PGRX*rcVzJ*~x3b|YS+#Y}C#JYIRq01NK=**)36idwY;B0k3AUQd!{@J-l z0-A|)!AZ!D`IxtQ_rYPWo%G7(=dBl^dk}4;6PZw0^fnVgt8-y}6y&kmv5{KQ*j+^4 zL%&l-^CEtrXpu*4=RqZ7Z-YW!u$H6={2hIuk~`CT+X%Vb7G3 zMhlO+{ z$y`roOO&}`+ffDaJ*znTK)Z&(w&Ka%Tl>$gInvaXM>owW zFWKqQLjCu`fQ(do=y|r8YV;?R(*+X{;jjg)jbLnw4*?&&)o!|4fDJ8H_0;y$L#BdV zogoZeDF&ufQVJBMWE$p#bbmH80--lwd zDze2&&~;vSPoY(KCVccTP~LNyWCFemH9u9 zWALudu^rv{H(wK+^R40YFvdAm#fLkpdhCobE=^DuY;ADI*<}jlMmCDu3)4~=C$o_E=!_CcQso{P7z6#w&`#IFJkNk&oo0G!8c=kO(1pDbEVGGX# z6S|ypmLB$&9qo>|1mxqVXe_PYPZNDU(sw8_!!@duw+4{ha4j%8emt~%Q4Acma^g51 zY;?Es%uj(Lb6vM*@dDA#8xYhH9oc^a*#6@Pb9 zQwMjrwkwaA6)wwye4D`m(`?IM+fzo%Y*vJC=!Mz+`a=!PJth$wK%1gE&UL+MZqR73 zO|yTg2WwciQ8bmXv)q)He&KucuT7Tnw!+<`f!2AcMoS|}B81?Xw`mtoqcV=EFe*2$ zdJ+=yr#V#|CaSH)q-`;}J+S`~qQv7Cm(~&F*8Au&?0#mcm7s{~u63rprp{w#k+^v4 z%m(?DJb31ZX_z>34Qsqq=M$5<>fDEm4B3^>p^eyPp2xGN2eXGvnFL>3jDL6htezdG zx3{ntsaPu%_~4Y7fhD0AyNc7CE#gDt}n6 z1YyKgjjr>B;;6e2Ff@1w1PQwAH~k8JAc;*a(-V>o!-sQ^j)vWje^?wpM7B#T7tU9| zzQh9q2saFiT3OJ^R=sP&h&-DU1fPbB-gI~?U*1Mg!a9#nGDi1-P1cZ~`kdsnX9N4-2sKs2o=VZe)qar<&CiGC^CehF#*B6G z1)q|s8p_IxKtcyGa8v0nE{a4vKA-1iiKbqGj5|?z3LA=-hnI}TJaA96{EYRW907hDM{SAH{!}~lzRwDYVPDP^E{cv$+&Slj6q|pg z8y~?wu)nj4E%Boi@1| zvwwD5u)>JUa-QPGiMZ$52(A~adVGqUX3XvzCOWm4mA0pHYAQDtoL!VB-fBr(eF~el zO+xNi<2^>Ba&?z!n)G5Mplphso+`wdr^;*)GC<>}&cbY9g(V9@3d3H^)O1=hTsK!H zGpKs9&yh_bQ_JN4h8MH(J#vxTx6nfS2muLNty+#RftQUKxCqW21VCl?Zn&vj?0Sc; zFmkh9OSK_r56R@tX9&E+4NW%8^*PSBjHLh|5V2r9$qL(JK0$G@1lxg~$k<&_>N-7B zm#dxS-o3-zLV0+Bh1Eqt?dwY&&69TPK6IB`wE*X3wNvfL@;W`aW0PnO$#%~t=XlXq zP-judQRWJz%bL*>(I25^4_1Z@^sFMv&9@ndUzIZj9~cCh&i7^vo783KOGiEFzmaQGVaK*+wqys6AbJNh2^k;sEu_7}3dEQ7Gryk$!90LO32bfUa z)xvYrtfWb$cWnM}kW7=*?9$}X2n~kguIdY2J;OZE05dxeTCp!Bu3)M87IGgDAd;Ix ztLbqy25%U(+%rLODwq$`b_a5xqC+<11Ue9G0|!~y4qb{6lv$oUSnMFk0Gy>5HJw?< z&XGcoJj4_hZjxwV6p>LwQFn&mWAACx?(ZYa?MkP~`vs!n)$>pSCRoyeBa6$^TYvFm z3xq??2t&9Kt(rU~GqI0B z3w3>gixMtjQI!hCQgXF!?TgEH!||$5(v_m+8Bc7EPRjg=*5S^u8JctKrdS}telQE6 z<=ab`IRb6n+&`ME$_p%Xwcsp?5Vj?m1Y^;|=#N8luInxxGe)O}ao71Vqg`J`Q)kmE z>La+OsSDjz)Q8UK6J{EoMCmpzqX=(iwx);nUU5-X3yzBL-DZ>Q*{$TaiD<~>Qar@R z!F@W9J@QP2i{qtp;J&lBSr~%?kb5)op@pKP37m7&I>dv_^yzG=7qQXDWi1F{`wnHt zVpe}`X+aupEfjSgVgf8U@SAyB_VQ*DSnctZ!EN(^14*6zuvhYq6W%(YT z7Q1~CqHnM4Aq(vmn9h*htf|BBga7v`JKM)0iO+aupUvE&p?a}~)|59;k#JpkRG@Tv zhp=_G&^5*6b7V>TSbhm?(sPYVz+ka~C^_tETxQxVv&d=QnN3VD0+ngw3_NF-GS3{pK0D+tB6_wO9(5s6k z%!b<~^r~-5n4aL~msjrZU)JPZ6}7jZB)`4puGI{Dyv@|Bmat_dL%+m#{TRKf2r7uH z$w+~KF779&OPXu5OIu#vP0kjsnoYpr&q+%o73Rd~vb*bS=C46)j7Yn_Hl#CVX^6f( z1`$S*x*oki(0A(bdLn?_);^Vg6~YzBg9w}ceo%1_uzTzga2fp#)Z%Oh15yv>tNRFO zr!SM#J<7?M^HY2`H@?fh&4bS=muVd_t2q?}nUwRM7D3L7Q%1tep#q$ii-Gx1}E=~nrhL|NEh`xNqv<1jdEp@Bu zs(tASM1OX)XA`*D!Q)+@!}qLSa&7|`8G%2SdLVy~kB1MNI#QIVs?C%E@l>$k#!QbF zPSaQ9+jlttt?k3t%&=o`c6k?go03e$6d9j=R@TA(+A3-i?h{q{#An=iQ{MeRY3hS) z@D_f&C{ym~OgA*%<22pd+Yr!dX^*~o2(UOx1L973=B)%w;4Nj+Q;=NIJKQ&VNB%ZD z&^%WRJ8u={UclH=y&JeZO8UN{Qp)HKQA;XTMD{1xQ*|6b!B-G7+m@jRwKlKd)hwkyCwclP* z6;^#Va{_hW1WTtew&Yg^sIHg5^6Tk3knt()8!&q--}xSsJ&qGzS1^xbS;pxZN;o$=+>)hi>~A2J*RJ)Y6SNPkt9PTGJU3ZYhx4yG%>f_!31aB7&E$d` zx0##`fa{{=I3dHHbq<*)X(yuVA zc}yzmczAN?rDsH3lTwx4E8BKuD$!YLH(`1PI~1d3{@ZA7)lLvCM*EE)v zh7I1>Y+<^(qQt3vj=Zw8(+Dyu*Zokk$J^Ze&|DuD(w~+aeO8sdC-U>Cn-o2x3_ecu zL>IGU%GBNVGB4WaUzM8d9Te*0AB_3S5~r9h=~0AEZEpsWXJUWmFI<$!PgdlI)piE_ zA-dl)zyOjMPT+30X}BhJO~V*PjZrpke7O@Jrm)2)uZUf1{z@#{>86w;PO7<1#G1^Q z#{z|!VD+&8RjMcsDy;3)#`=R$cvk(R)&*zHanpT}# zz=02=z;jC-nN>@TI|fQS*Yel_R9!6|Zk!&Un~{#buV9glS|>R+ zjihr9@oGgjcHVSkKHStIRayAhrPA0oV+^NhxPQp50#T0AZeP{Pp_0>@iAQ09Q&r@f zCcL0zZ;OYg5V|$1IBOijHB^4C$&oY!xD3(kzzUj=?qVBGOg)5Y?v`RD4djVOzSYSO zDk^sNmMV?*-=0B5J9lVc8tvheSq*V?dT(=kUEfF_Wo*da-1|=6#E~;#!$Wh3ONU#d zgds;JB90?C;>uG~jGo@k1kr$8ZnH7HhC5j^Ex(M&Im^d)(k_UpGVUOXP`J2<@6ig< zde%70iKnJjaVfTaC9R1pzR&ZLMPNAhJqV}gZ5L$n-JQd`Nm#);iZGsRx^%yF10*7qlChb={k!r3)h>hc2qObUnKA+RL6RwL08LyM)$0wumDe)3_W>nJ#G1qymR8l_xwLhe<=iE9vv~ENYx0-Onk@Vi8#Y<*NjUi z@@8ak4P>BGxTH#L|NDW5vKDJ@_c4jGg{LAOqXA$noZM;l6=Ds!TWUy zm?t!qw>4TEw{x94M2g^W4U)91&<7UpKinvX6D$x z5w?Fn!jIXx`ZP3tInl(Qt@d$%X-3fLS9ebofGt6C?pIQluY*dG^(;Wm&ru>A`Irt; zeMrc-%R3jmkzisvxzChQ>UHxmU}lB;Tc+RdBuuLQ&SZ2b@?XPGbG63R zLGT}_kzr?t#s+5Npd{hgMR^_oeOF+{sqo z>vtF$A{Gh~lE}g_sw5Q6JM^BUDV4)&4G8E#2QeXi7QZx_%vei6(RduU$Yu|6!Wkv% zE?~0`?0`IDX}@+ic}UPPEg{&m`j02iv3rH}gHdoeQ;SML@$jsiH;h`FUu4q}Xgf3= z1_Y_T{PQbi6Us@I)|+!3TNu39o>B|}5B%lBX;x6J?<+X5*6g8$kL#WdwORc;W4D;L zk=I2T)RtqWNzlbS-+0ZpS1ezDXU9nuH5faYUl+Hm6|=3Y$0Yk9 zwwKD22u;qYKbXY`|JFW{d=#531X7OWESv7a?dcWH<6TkY<;$<4T!GeVp zx~65mg*I2RrODl=uOJR$gs-4AvxCA{znOHL7HF8X0b#p>LMQ5QU1>LWjM7`*5s_ci zxUk8_T(p-1!_aZ0sz0nCBSS$+krrt8I2>@{+@?s!Xnj?AFom$Vu-O<`i)Mr%Ft&ND zPEO4Td`rLMC~B)f>-0`qdJ@J;*aRF!0Y*m+T&>oc+OQh2d}nfN2kXd$dJJlen^o(d z|BtS$#;hFRSpBsr@)ujG5tWNOc))<%ff`U8F6B@K$s<7mH}%W%KpBOjT+uIlPX~VL zU%I8#oA}xA=tvMDI`Qfn!T_Z>vzi;u=mc;Y`sB!k3s+Vt@SoJmN>Z+FuWf&SIiwtQ z1tx_IOwG>LFW;INI+?P{C)X00T*{JRt)vMj88{r%k!6GI}L`cisf z(*7{N8>^nJ{qXekaNt_dmY$(uMg!~Tr`V4Re)xpSGK3TFaL&|F{Hq+^($S2k>Y!c# zH?LMHCU$WMzXW{1ckVus=CHwDO~;!Pwu-^HRfYgw5RuyhveVtNo=$5s^|!aW?Tj@F zMo}6_Y@*Y7x()axIeuws;ZWM^g*7CLDcDfXhWmjgZpaMv8gv8qtS_n2p#ZfGzRn3bK}COpxp&BZybKno?(eRDmZx*((K`Wu#OgNqey ziyTtuK50J_nB|a|K81o!&l_O|)2ijzWn344xogcbHYos&NZ6S>_^6Vb_)+rl^W3bh4)%KPCxx)3*w|o zcJG6s#0{&Ux|Xj&@0KgGr?EkWg3<@4kk-;{cFSF{tB+Em_z!=gHAW1^S{?l%W-?aO zFI-dendb9)q3-Q-GM3oXySLJfwR`KJm^Exy0mwmiq_?||>&w$3cHus~tj}J1N zG5Ik+va>{mkr0O<@ot>+RFP&uo6=U+iss|Wal-LyK}qU_t*k>YD9fJmpH|H>!a>@s zB@n?jWM_JsrBKS82b)qc66uPR;(&GnlaCFCW4oHh#VCh z3d<#vlfoD^VxeDH)o>pBYq(ktHwCVT)yIH_>iRP%g42r$yp(rddETqQ~8dmESb+*i5a7~RzQ{epzy}R5G6H5Khrn!k6(F%!vx%}4q*ZxQG zgr&q~uIYC&yYmWUnJk=JG*s#M#Eo(wv`o%O&d_i_41NFvTI`8-YxGHxbAy6(w^Ds( zuX1L%@1`2Fc*W-hz~SB((d;vXl52}olic5g+%~av8tu@$Y?f*H7KuVEcw)o9BOjU3 zj$Tb>;;3#UEJ+N|qS)aJBXAA~RCXf-qPrr%qy}kjZCOyO*L@Z)ceFqpLhhlJg8%TY zS&$fw?R`@Ttgi(;2jwoVwAeTcZ-(UYddPr%4+{5*z0P@4#+Ej5yN9>=$@jlSI-xwE z>-8R?#yjMRw`F(#q^flhw6>XVD1=@C&V8W`5a0Z&$n1gK<3M7ZTT$I7gqz&pwxr|X z{^s|OncdXH1+08#6FERQ zVaL{P5O$9&$@Wk-G}II-d;e%X>KOrbBO|4)hEil|B>EwfCG?+-FmoA0&yhyRfv60#SLa#&ZNV|wQYUs$*f+9U zC(0$)kC0>lp4~`b;F&HY5Y_5mT+0*Q;c_Yq(pHK&EE={})b)a`jsd3Y8@HzXoS(O) z5u;;K-udp0!$NT6P`#F~+oF!3bPR42K2Zw@hv=g(UJ9PBHzZ0^0nF%DzaS(Y#;yzl9 z6=X-i9eky*yhx=8FtY5xQyy3-BPM=pYpxm?E*@ITkX{&xR-whnj-b`p68n`Du5}2K z&cACzzK#o7TzoWL`oNS}=NtQwL!R((3}u#POzb3ZyaksWB{!_2LQ(cVv;Z3dOOTw{ zEpID-u=iD0v!l5&##mvbqoX5#GAsN~Xp4GZ_0!-o`pVLRh1Y7cT)Ij>X)zM1k+!)q z<%>lrSOpL_#f2OE?TpU z+7#8XuVl5?T1(n7Sjh^^`EMP@M2UdCh=ED6d#7yV&VF)(Rr<#UM-(v^@WG-kr2c~n z$9PiYJR1gH#^SqE4yk^xmfYF-moA}J#*b*>CTHX2CwC+-N|>cwn9-M9&JhJ^D3VM2 zJR|n=#-f@^P`>Q3KGJ&b6gAxydpcON`|O*?SQ^o?yoxghn&|uI2YB%#KQ! zSYDp~zUdHoBpmRk;W96efMe#j`p^EzbYkgI*@KX{84}usN6Wp^3jK9IAPZbUbvb^gQlo>j?`582k=#GECyL}>09O+&>prdni04I^Ibsh}?0 zfg6v*$~0;BJ$9J`Xy>@UUqRrVMnq|T{9&f(nMt5dtb~?2<8K8WuGHGLVzLCfqvPmP z@rS*x&90+*)+M6ZfF(702dIAyqtb$QI!goq8)Xn^5qauq~xfh$nk4UIQS8dZ^`PDq_{PoBS|~j zHeW#D0)d>z)I(N_-x_o_#~zU$g|4BYt#rD`HpI0^2DU}TW#9V(GV7eIMBl=8+#tEE zYrpP5k~uUbPLomaGC^d_)EdhXj!+Y$nVZZ-V(j4st$np2czKCOI_y+y3tba1&Di_> zp~Uo^iLT!~S|p+@DH?BZ z?&#ZnyrJR($`wba*(tz5`6}t}HZ^C;&}uj#65# z|L}DG3^mK~yA&r%U)3G>hqYmxR_D@$d)sd_@GY|@>heyCJ$>Obe`_YPf_yk|Kkn4v3)Jm-b;1^;uY#RYs~)bQ%CX zPCaahL(>ndnTk~z{4ioH+r<|L_6Dm{snv~6lsX$g0_M2&bku(TyHYM;rZ)*q)aERK$fvb`NYFsAZd z9tmK6sykS{nwf7(nP2vRnOVZm54!apx^$zNr-m4B35TAPUN5a9^XW>H7JW}90qJ*T0(8~ymZQQh2KIc zrRu1W5pwBg07lYM;|iHtvedkh<-CZ;idAHorh;K&d@DOhR<9O5@J%jA0TEhWatIx- zj1#XH8&!dRh{7R5MY$b?i90E4FQWn<9=qzOIsL?H?kv%~E(Uw9M;jH2EQ#ZG(!^-6 zreylRpCZ>~4j&d6{G*9VUn%-bod5;PB&PahOO>hY<8UcYtUbL?P&Acf6yGWdkSVBo z%bf%o25Jhfr>VJj%TRjW&H*KPx3M&`(GEe0Fr1=ZTh&fup}E$-m$q*I9>X+_`IQ+4 z24?)70y3qo2b^2SEcwQ>BGoGIJbBn4XmNN#o;@!@`JkzynkADwMw9<5aX%RP1;Y1p z@bIz^_M`XmQRwc41B`BLk^u+f5WpI2Ss<9Cn3J@?Ez{ zvQ0nv=O&GQA#!B9Aw^~au$asYeX4q1NJOYgDRa%)v4{I}cSJal4Fe^KGqW<>ZM!U* zKiV{C*bNF7u8cSc&pCEOUb03nx^Avxl25GWG2Y!Wr>F|Qpl!_V&V(K|CK&R&eD>pV zztG3D5?Ye)|I%tkg8ND6V|cL?=d%jIE9KW=iK`;4=`HgI$Jq>fx{;g7K2rtTu>{*o z&0P~EAs5G+Ng;u@aBCkKN-zCE*P&5+acB@Fl|aijgTVC=@6q9YshD_FtwSu6sit?v+o*PeM)6HLoPqX zT7fTG-_N|bU3x@Ise)li1Cx2t9F3h-b085R&Lr7v_4ky zS?j4G@n2YS1To`@0Z!eT^76KuAuOF`mevV|565R*k7IiRGYd;{q!_c=ut*dXv}6qk z0WZI+e0+7k=8C48ELETKAV&ZGy-DJfL-}`^cYaOgI7?7?o{7dOVjx#I@XY6y1Ettd zMaoesZjG&=x8#gx72~&y)dKd_x$p{3X=&`)(xivH!pJhDgh)?0`u1j+`%6hJO*l~p zq{4)rO=xCN?!S9YlaDb?-dD0HWB}+4|7RO56d&A^1J&0aU#FSc3ICr+P%(giP0jv< zpPL#ZGh|a8z!$=5fs$+}v;__JYmjp`wsej+^s$fVaUZ^6S^!^n4i*w^5-ha!G1uFi z&pQeu!NWYv>68efK&;HO^bGD8-O?5kXtKwMWVV$D5hO0}cB+r$Lw8c2v`q^8<@!WB zN}Q1XEXbR!a$huy<`=pb!#!anqCFJVBCc?Se5BiphK_CR^G6~M3_3bGRxM@7f4dR8 zEbhgV5Q|wzcMLuhc4y~dAE@ec5un+qA<9Ak=CExGiBeYz(;K|O#*}4*f79+WST68n z0&Z^loxj%XIs<(wlLcR=)emO_vmo>jwXn!wM`kB+zH>zFc9M(J@St}U|@spowi#I0|BapCCrle&RGR$^JjTMV!t!;Q-Z1=XwwY;xdZS(C5=Gbk|8EOo|-^ z4qX9o$1pXC+;%o~_Ftxvx46eMbJ5;5+$_!yLNO#bawxa7V=>@|^rMnkAS5u5$jhWB z|WG(C}MPN_hjy!xrnLn+C!Pnb!+=Rg8)+zX#szqoUmXL zseXY*1&yV%C3$}kh*mS!GRYB297e%?>bu!u?1$X4pBqmAA_$GBxkOrIdP5iyP@0p; z66}!8RbyDa5_&-_#?Kej5vdFGld2G(7oJb1O%M&7q{{p zP$9;#znK+XGw8eAPC>%ZpE&>1EgzIfHtWlAA;&2-KaX_ z2PnKx(djZQ)=>nsyF(n9pc&3;`)aYts|*ILO557$q(a^hp?3SAj;n=-@E>cgIAN2M z2Iw;4?;euU+uS}W-_p)A7J-D82PEMgv9Lba`epIw%oL~oa7|QDP?TWHgU{{sVx?b*Vs5LvV-6)2Z(FfMuZVw=3Si>q zs&CTCLFVw%{8z$wVmzD^`0s9q(t5}33G30Bg3oGBMa3xvUYugU&c^fSaGehOQn-#o zbd7Ix8^`iqK}Xv5&?MDOz8u>15RM6yo~Fa3i5tG6h;)9gCf*YZ3AXTDR#rOTkf3T> zQ**PMi=CZ`N{Pi0!i3PvHTKcTA@>eJEGX23T$gFN%}9-xv9&sbDN9wFz0Wj$9`mW= z)errYcUF#>*t(F~g=?xS$XNs{GD7l`wAtj)H<{e54yYH$VY|o1yRquKjrg6{&dl6b zeH!gtP@sqphn;Ak4)qb|;2?-8BSq%CS)V|MufUfHH(SEnraX!p{nMo1p04|*>sJA< z;$IEij$+dMKikROw1jc&LO>q=j>G47Q$cs51#y=9L8_67I<0F9kwe0HBI7V5fr@39 zL#wqjVxxNfWgSrY$O7}R=mwlVK^c6AfA)LDiU+~y!m4{s+|y6cP%*j?!w9{-H=y)G zT^NB9Sp2Wdg1X)cmkSM>%!p!bFc;xpkFL1lQ#T@?GgqZWef|}Mc2QE}YE$fb-GwPP zy(&Z2CN0Gw>rd{$rCYH(=z~|A$(NTS_VB|fV}}9yJk&@Cm0bF(UECP>>-oduO%T)4 zwKxy6w5%)En~qE7J-`2%+cAavNsq(fHjes4cbNYbEa2Dpc8=Swo8wd5C->_1k8}CD&G0pt$KadyGwrbxvF0z+il3s%yD`@LtzFlS6pJ6+bm6*z<)m%9ruyTF=~-+}agm zLPZHnyCw8W7wvon^=~@XqnaV%e&kP`tD+5Igz^RZ_m5(uw)8iftQe7c2L<%VB)T^6 zD5dV@NYd0Qo`~oz)xK6073Y-v{MQpN`s;!BIy0IvUlY?od=+JQFL~0iY+d#vujbOZ z@Oo1RK7bK5(>m{MeJ%4_zv`+B!Q1+zS&iCol9eTLoIzNmRmAp$a9VGn`C_-!A9!kW zRYg`nA4>EALI(*;W-lO|Q6$)b>M+oc8+m6n2Br z&bS;tQ0M5A)-y}{A*Gg`b*Z{@wCPaJY zMMbn71kXz z)tPWc%Hkv%IYQOEMr|oeNY8$HEblxot`W|odEeHxj@+BPMWqapH8`^A3YH{*%=-Tg z_EYsk80Zw+6GIOjX&JjLDl zoKlr}bvhsQ@K*C$ZCR}sFY&}_c$=<3u+1Bx*5DcW;Qu1#{KuWHfNJS{)H|7Ry^KKD zYy5IJUZ9F7ds170uY=im+As+_J3!=lMSH93JRRlM;qk(9Mf&F(iFt>$kFgJG#`&Yy z>alpUP3zoLUG}j>b!@M6iPUg1bN1tO_FDaD8O+0|T<0R4LPy7P^P0D*Y1)dKD%SAP zu~2+mU5D*#I(oRM^{d9}LUHLk5WBbHJWAk98k}Rd}+fKx1 zw|~bD{6f~U;EdPs#sYyUOrfOfWeww~iruY`%Dd}A`&Lj%@--Tk%1TO`i)2%U^|#~R zH3Y^1IQuvrcg&J!jV_cg8(ixNXsrHt%>y^0uA#?2B~J8mGi>H6Dyd_}=A+#_$Y<%G ze6`s|#z#Xd(MgSkxD$a?f0~RUWM1Pc=I~skODJz$knh6ts1BorP%76K(H1%RjpkX6 zeHid8h-LFDE14YkGldo*DSLVO{;h%~_@^iLnkIVCUu)vWXQ_B)XSnQiWjr*^kvY-| zI5jYT>!JRVNRnw|Vx>j;R+9@X76F@o`P{i^j;l=q+dZdpdA~I<*>wJrCte?ZRF<>;9l#!{Je= zlorpHcKK6_M^ChZtc*^GqB3XBoomoEvbtpq#wQo)1KUS&USiAh!$!amHkhX_<0qZ+ zJZ6EjfkB)ycpbsCNV8gUc=NCAbk3pkt17n&}!ongMp@%@w$`AM8S@6~{(hyI zoqv?M@kiRP-l}#Tu&1IqJHLBF9Q%RJCl_Xuv~3Y{kwoMj&PO%(jfrvi7xS-&i5M}%ji!l zm_-~>BULy7lVo>CA!HBSzUoAVJ)y|R$nkBk za5Kqp7z&|u~3C2IEwtEInVB7d~iF3Rk$r&tf zSpJ>{)u%`RsxOCfjzOxvoki=aXbUX(3H)RS*djnSseyAc*%sl0;EJlfmLnx5(FrIDc9{o-45d$aNnBk19ml^X@& zdvx0SBW|o!kB~rNm(z`0x>F#ZCdb1mMwJ?f1W>Og4IgO>WSQd<1FktWjV0Kh79)u= zwE{9@0!axD7cKh3u+>kwyvS?KKgcCYx|!$N9V=opqQLivtass_^0_u~Ya{af2sidm z>hAuXASbC;(3ddfxg6ZP+E{r0vUiG>raUj4zZrvKtKILY4wjYQUUH?y`ot>`%~!kS z4-vqZ!LSi7mGQexYH1>AW#v*2dXGax*zV`(v*f}?3ETV_%2%9Q82DSEj5Exer3k6s zmvh#VTw`UgqdpoNbDo5SuQ3S+(0X zmX_zsfNiTh=v-WTpih4O}*jqCUD+B#4A>j4s0w)l9 zqarQ&-}$v@?SU=+_b zWU;K@#KWNUa!8!E^CT>!&HYAF)hy~FJ6>7G9{LPGm0l-0=GWEV|D^@R@HdrEdV`D0+{Koa z#-hZg*@cYUHvHhd2mik|#3z9y?40{StXUJZ&TS5$Mc>_CCABRAL{$cI+rKfr@_0vW zyGiNUv!LK-+bP}RR5gmCOb&s=tVejpDjUeLC3suu=p5;lQP&);MYO(l&b52wvIWbS z?PN7A)yOViexid-ZKhOtHOtDl?o-(nZ#RD$Tl{>m+umRx4u=T({Pxz%8*k(ubZ5jG znJ?#*(rihb0g0(X#nfqQ1rXJtShm|r@dW_ztDlE@Vn@a4Nrwj_90Ar6kl;!&BxZH! zm|d-&0JNW;-z7;XLoD$8P2a>WAY-a)>ZEOa;+xtpl)3S+y2pXeFP&#$MB#!R= zG_#lOSXQbEAfXOG_*K7Fu`>+7X#bYI7JvNa5174>^IgHgncPH; z5^X(;*xh=xz?gV6y#_%Cq0%Y0MZQ8Qzcd5W7XtGq@uwaQ$p$ox1M0q*sS7bgBS0I#mDIU)OG~PYVD#ups{}3LH41^6g@50}y&R7I z8ffzTjLYE3Qz=vf$VmNA%w=WFiDG&vresKWX&lx%=aw;b0W&k=Qke}7BMn3|za?Zm zhF&XRe;FA*CyFa0S^;Fg=D}2w{Ix!eb^R09wA!Ylf}SvKF=RBx+RK*LCOJe6yG=>A zS()NFvqt$9jUb8p7Ch(|l_k0x=HWX*@?GYK_cv?7V;){pXZyOX5r=um-MPb{SG5&9 z_r(5c0GX*T!w>v*!KAG+^ZIt6nt6pw42R*cvq(cdk}{GXXX zx~p`3sXgW`Yf&#MzmFXC!koR?jdMW15jGrdOY$y71g&_yeLy4Oxo5p0K6 zk4VS1^$5&LipsTis>1c~#i0BZ`cqgR=|M=FqXZv80k=;oChk|G+;R$eDeM5k_f@Xa zw(v-EL31;S85b1>Z(}p`EXg9 z{k&6joCw@qY#^C`HOOmgF<-~<01sf4f}&I=4ft9-x69*q!q`pS9rsF1b7QMk+r=8r zk#5S&Fw|9tZLt|YR{>*x(1T<>0H)Nl$$Ro~TAdo{tjFvbXJ==el$5=C7_nRxPU$}5 zSP&5hbQ;`Fv^+ok&16lZ!>5RF46M^i$J<|7S$Ph()b7FFA5Y5d-XOsY7KK|$d1kHr zL&w_&l(JzKbaNN~$Y21uu6`{Ohi(8-ZlopUKUpEv5}#)UovPfM-970jXPkKLmi%QS z(n@1~Yq?**(jC2Ds{YX#q}cPhx&4U{&jI>W;NQ>^rZ`tI;GH3n-Ft1OQ)G4JbEmmNiqOYrI>=U)M5>E`G8 zUL>Qnkr7n&IIH_=xsIm;5BuuVf4@=e40}E@Rt7aG4}aQ8_VLM`kxz^12$za=I-b*M za=qA}4;lDS;lyyv^zOb42ustlBOb&Ncv#BWq)?XNa%R#;(HX@Ol$h9ogFJTXPe(5w z$EX%n*6CW&g0{%hG2yDrXa~mQ?Tf775O~T)Gvh^-_@havKb}HIlPd7=y%O354oZ zAof^EK2vosfL$)Sc&^r4U6RWaHz_D7gd^C40v(-}30d+qpG=b_PeZ5mWU)|J?*AomwJtXY$Y^@nlXm=L0&zoj?1cxwKUc(dNt&KP^q#%Uz$p;tNlc|+`84O(W_mJWD^90FoZTCLt4MW~p7HcQWCnV*E5hMDT+O%`{= zum5I#c^Z)7r^1b^>)bF8TM{P$p#STcFRPAMP6#W-7$Vga6(@sLT!1(VAfC^&MO=LLxUGTFn;*efW z3@Z8)o8R=#+^s(8e@Xy_Y_TE?sQDf~*D}bj#EJbuLEvU5bq|pN4duDCsL1rHvBPQC z+&OH5^#3dHN3pNq;#40}Ax;LYfgE6$U(fC@Yy!GAJc%gpLl23K8X7}GO1d9YSV!N5 z^WDs6gdBDgKpL{d!rZ-$u0nh|Iy$EPNq;o(-2D8y{!^7>xMcVo-w@1y&4qBsnyhi8 zP3U1z)2M5e3sqLZ)~hW@i-LiUY|8;z?ni^h@&Q`Y5+T0tS`WqY*}THYPFXrJR5Eo@ z&~e#{-iDrzj;|kwIw<2up>As7h_gq`VdvCf9@_ikxU}nm3{#C>X1O6d?Ju`qO~+E% z_niw=n$hGTXMsvpx$etIeM7TV@@c2=&3gk5F?k z3HHbw*z4(wO$Eee^s7~Y%`18sxZeM=VU}M{J*=!PlWSD*2Cv(NtX&4yz=W(b*?2HRPIzg)RUXJzN+-Khd4~6#s--;|Y zJ|nw@>H-x}suZ~9#&z$0yWu3pR@=*+K|LjD!t>}l(bDVdYs9AP02;9*#p;x5AayNMo0k!&L*L^&wMp0{V z@QQr@8`NtICTaMxzF+v^=H)K4&*8{me3?8m4b44+D$}81sVW~I-y9K-?FOfMG%Df@Y_i=P zfs7ZH%5FNw+K7#VGmZuqV7zxDi)fhf?{C`~EY02xq{U%5_nXh#OXu3wQD)poAoY@3 zaY_fBQt5x8O{m3?m|k*cBga2M%pdUEQsz}J=kmIER9VklQctDC#4v||UT5;Xp-&B@ zr3!G<#x}-+x?J<0tn diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-xxhdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-xxhdpi/smartthings_icon.png deleted file mode 100644 index 449c38788e140535b3236257fda946c78cc23e85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46956 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 sT|^uE!)2cS@pPJn;Ob%7 diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable-xxxhdpi/smartthings_icon.png b/examples/st-device-app/android/App/core/common/src/main/res/drawable-xxxhdpi/smartthings_icon.png deleted file mode 100644 index 4ef21f51f5e2f7a55a40fa215d9cadb0a89fe1e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63074 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 diff --git a/examples/st-device-app/android/App/feature/main/src/main/res/layout/fragment_main.xml b/examples/st-device-app/android/App/feature/main/src/main/res/layout/fragment_main.xml index 5faf9e48e23b77..724e9f21634261 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/res/layout/fragment_main.xml +++ b/examples/st-device-app/android/App/feature/main/src/main/res/layout/fragment_main.xml @@ -91,24 +91,13 @@ - - + app:layout_constraintTop_toTopOf="parent" /> diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml b/examples/st-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml index 378fa4f5574cf6..a8305e4274e9fe 100644 --- a/examples/st-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml +++ b/examples/st-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml @@ -254,13 +254,5 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> - - From bbb077773e9fe9b50eaff888c74f2d779ceda653 Mon Sep 17 00:00:00 2001 From: chulspro Date: Tue, 11 Jul 2023 10:41:49 +0900 Subject: [PATCH 04/36] Update examples/st-device-app/android/.gn Co-authored-by: Victor Morales --- examples/st-device-app/android/.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/st-device-app/android/.gn b/examples/st-device-app/android/.gn index 5cd171abcda9ff..3bd513ec621bfb 100644 --- a/examples/st-device-app/android/.gn +++ b/examples/st-device-app/android/.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2020-2022 Project CHIP Authors +# Copyright (c) 2020-2023 Project CHIP Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From f35a75d448908a0d1aeb9f91c277bdce06d580d2 Mon Sep 17 00:00:00 2001 From: chulspro Date: Tue, 11 Jul 2023 10:42:15 +0900 Subject: [PATCH 05/36] Update examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java Co-authored-by: Victor Morales --- .../java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java index 4f3b135a3e4d54..d8a895fdf4d0c9 100644 --- a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java +++ b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); From cf9cca7633a430008f5d614f48cd387d0c586a75 Mon Sep 17 00:00:00 2001 From: chulspro Date: Tue, 11 Jul 2023 10:42:25 +0900 Subject: [PATCH 06/36] Update examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/DACProvider.java Co-authored-by: Victor Morales --- .../java/src/com/samsung/matter/stdeviceapp/DACProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/DACProvider.java b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/DACProvider.java index 0cd77c5dc78415..78e12707f5bb2c 100644 --- a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/DACProvider.java +++ b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/DACProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); From 3cbafd2d66bc57fac277f6a7f237ab34ab232c93 Mon Sep 17 00:00:00 2001 From: chulspro Date: Tue, 11 Jul 2023 10:43:04 +0900 Subject: [PATCH 07/36] Update examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h Co-authored-by: Victor Morales --- .../st-device-common/include/CHIPProjectAppConfig.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h b/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h index 2426d10ca4ec7c..c8d02f6ea028f9 100644 --- a/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h +++ b/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2020 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); From 07aad1111f48adc8c45f4965ffda60ce1f2f4b52 Mon Sep 17 00:00:00 2001 From: chulspro Date: Tue, 11 Jul 2023 10:43:12 +0900 Subject: [PATCH 08/36] Update examples/st-device-app/st-device-common/BUILD.gn Co-authored-by: Victor Morales --- examples/st-device-app/st-device-common/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/st-device-app/st-device-common/BUILD.gn b/examples/st-device-app/st-device-common/BUILD.gn index 1b14c8b656df06..67a1f0693ac472 100644 --- a/examples/st-device-app/st-device-common/BUILD.gn +++ b/examples/st-device-app/st-device-common/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2020 Project CHIP Authors +# Copyright (c) 2023 Project CHIP Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 3714147040dae61fd73a77680a096e06681335a4 Mon Sep 17 00:00:00 2001 From: chulspro Date: Tue, 11 Jul 2023 10:43:19 +0900 Subject: [PATCH 09/36] Update examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java Co-authored-by: Victor Morales --- .../src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java index 9fa7813e743151..3423b5176e45f2 100644 --- a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java +++ b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From fc5254b07edb9c5be2d9d8c08ac56372999942e5 Mon Sep 17 00:00:00 2001 From: chulspro Date: Tue, 11 Jul 2023 10:43:44 +0900 Subject: [PATCH 10/36] Update examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java Co-authored-by: Victor Morales --- .../java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java index d8a895fdf4d0c9..5d2a16119d1d18 100644 --- a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java +++ b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java @@ -47,7 +47,7 @@ private void postEvent(int event) { // called before Matter server is inited public native void preServerInit(); - // called after Matter server is inited + // called after Matter server is initiated public native void postServerInit(int deviceTypeId); public native void setOnOffManager(int endpoint, OnOffManager manager); From e79841e4f2803de03067129091c097fab8a7af05 Mon Sep 17 00:00:00 2001 From: chulspro Date: Tue, 11 Jul 2023 10:43:50 +0900 Subject: [PATCH 11/36] Update examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java Co-authored-by: Victor Morales --- .../java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java index 5d2a16119d1d18..3529253d3e7ee6 100644 --- a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java +++ b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java @@ -44,7 +44,7 @@ private void postEvent(int event) { public native void nativeInit(); - // called before Matter server is inited + // called before Matter server is initiated public native void preServerInit(); // called after Matter server is initiated From 5b4999f73e2babe82fe61bf1ec5d33ed5dc87fb9 Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Thu, 13 Jul 2023 11:59:34 +0900 Subject: [PATCH 12/36] st-device-app: Change the hexadecimal format in string xml Signed-off-by: Jaehoon You --- .../matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt | 6 +++--- .../App/feature/qrcode/src/main/res/values/strings.xml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt b/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt index a1277e2bc82b44..f63ca93421f3e0 100644 --- a/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt +++ b/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt @@ -92,12 +92,12 @@ class QrcodeFragment : Fragment() { binding.vendorIdText.text = getString( R.string.qrcode_vendor_id_text, MatterConstants.DEFAULT_VENDOR_ID.toString(), - MatterConstants.DEFAULT_VENDOR_ID.toString(16).uppercase() + MatterConstants.DEFAULT_VENDOR_ID ) binding.productIdText.text = getString( R.string.qrcode_product_id_text, matterSettings.device.productId.toString(), - matterSettings.device.productId.toString(16).uppercase() + matterSettings.device.productId ) binding.commissioningFlowText.text = getString( R.string.qrcode_commissioning_flow_text, @@ -115,7 +115,7 @@ class QrcodeFragment : Fragment() { binding.discriminatorText.text = getString( R.string.qrcode_discriminator_text, matterSettings.discriminator.toString(), - matterSettings.discriminator.toString(16).uppercase() + matterSettings.discriminator ) } } diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/res/values/strings.xml b/examples/st-device-app/android/App/feature/qrcode/src/main/res/values/strings.xml index 45e01e86e95660..0237e8b5ab38f9 100644 --- a/examples/st-device-app/android/App/feature/qrcode/src/main/res/values/strings.xml +++ b/examples/st-device-app/android/App/feature/qrcode/src/main/res/values/strings.xml @@ -4,10 +4,10 @@ QR Code : %1$s Manual Pairing Code : %1$s Version : %1$s - Vendor ID : %1$s (0x%2$s) - Product ID : %1$s (0x%2$s) + Vendor ID : %1$s (%2$#x) + Product ID : %1$s (%2$#x) Commissioning Flow : %1$s Onboarding Type : %1$s Setup PinCode : %1$s\ - Discriminator : %1$s (0x%2$s) + Discriminator : %1$s (%2$#x) \ No newline at end of file From a8aacedc54b5f91a540eda173c99f52df7a9ec42 Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Thu, 13 Jul 2023 15:06:13 +0900 Subject: [PATCH 13/36] st-device-app: Update .zap/.matter for supporting required attributes Signed-off-by: Jaehoon You Signed-off-by: Charles Kim --- .../st-device-common/st-device-app.matter | 693 +++++------------- .../st-device-common/st-device-app.zap | 112 ++- 2 files changed, 283 insertions(+), 522 deletions(-) diff --git a/examples/st-device-app/st-device-common/st-device-app.matter b/examples/st-device-app/st-device-common/st-device-app.matter index aaf95e4e78325a..11b035c27cb997 100644 --- a/examples/st-device-app/st-device-common/st-device-app.matter +++ b/examples/st-device-app/st-device-common/st-device-app.matter @@ -1,14 +1,41 @@ // This IDL was generated automatically by ZAP. // It is for view/code review purposes only. +struct ModeTagStruct { + optional vendor_id mfgCode = 0; + enum16 value = 1; +} + +struct ModeOptionStruct { + char_string<64> label = 0; + int8u mode = 1; + ModeTagStruct modeTags[] = 2; +} + +struct ApplicationStruct { + int16u catalogVendorID = 0; + char_string applicationID = 1; +} + +struct ErrorStateStruct { + enum8 errorStateID = 0; + optional char_string<64> errorStateLabel = 1; + optional char_string<64> errorStateDetails = 2; +} + struct LabelStruct { char_string<16> label = 0; char_string<16> value = 1; } +struct OperationalStateStruct { + enum8 operationalStateID = 0; + optional char_string<64> operationalStateLabel = 1; +} + /** Attributes and commands for putting a device into Identification mode (e.g. flashing a light). */ server cluster Identify = 3 { - enum IdentifyEffectIdentifier : ENUM8 { + enum EffectIdentifierEnum : ENUM8 { kBlink = 0; kBreathe = 1; kOkay = 2; @@ -17,21 +44,21 @@ server cluster Identify = 3 { kStopEffect = 255; } - enum IdentifyEffectVariant : ENUM8 { + enum EffectVariantEnum : ENUM8 { kDefault = 0; } - enum IdentifyIdentifyType : ENUM8 { + enum IdentifyTypeEnum : ENUM8 { kNone = 0; - kVisibleLight = 1; - kVisibleLED = 2; + kLightOutput = 1; + kVisibleIndicator = 2; kAudibleBeep = 3; kDisplay = 4; kActuator = 5; } attribute int16u identifyTime = 0; - readonly attribute enum8 identifyType = 1; + readonly attribute IdentifyTypeEnum identifyType = 1; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -44,8 +71,8 @@ server cluster Identify = 3 { } request struct TriggerEffectRequest { - IdentifyEffectIdentifier effectIdentifier = 0; - IdentifyEffectVariant effectVariant = 1; + EffectIdentifierEnum effectIdentifier = 0; + EffectVariantEnum effectVariant = 1; } command access(invoke: manage) Identify(IdentifyRequest): DefaultSuccess = 0; @@ -54,11 +81,15 @@ server cluster Identify = 3 { /** Attributes and commands for group configuration and manipulation. */ server cluster Groups = 4 { - bitmap GroupsFeature : BITMAP32 { + bitmap Feature : BITMAP32 { kGroupNames = 0x1; } - readonly attribute bitmap8 nameSupport = 0; + bitmap NameSupportBitmap : BITMAP8 { + kGroupNames = 0x80; + } + + readonly attribute NameSupportBitmap nameSupport = 0; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -119,12 +150,17 @@ server cluster Groups = 4 { /** Attributes and commands for scene configuration and manipulation. */ server cluster Scenes = 5 { + bitmap Feature : BITMAP32 { + kSceneNames = 0x1; + } + bitmap ScenesCopyMode : BITMAP8 { kCopyAllScenes = 0x1; } - bitmap ScenesFeature : BITMAP32 { - kSceneNames = 0x1; + struct AttributeValuePair { + attrib_id attributeID = 0; + int32u attributeValue = 1; } struct ExtensionFieldSet { @@ -132,16 +168,13 @@ server cluster Scenes = 5 { AttributeValuePair attributeValueList[] = 1; } - struct AttributeValuePair { - optional attrib_id attributeID = 0; - int8u attributeValue[] = 1; - } - readonly attribute int8u sceneCount = 0; readonly attribute int8u currentScene = 1; readonly attribute group_id currentGroup = 2; readonly attribute boolean sceneValid = 3; readonly attribute bitmap8 nameSupport = 4; + readonly attribute int16u sceneTableSize = 6; + readonly attribute int8u remainingCapacity = 7; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -187,13 +220,13 @@ server cluster Scenes = 5 { } response struct AddSceneResponse = 0 { - ENUM8 status = 0; + status status = 0; group_id groupID = 1; INT8U sceneID = 2; } response struct ViewSceneResponse = 1 { - ENUM8 status = 0; + status status = 0; group_id groupID = 1; INT8U sceneID = 2; optional INT16U transitionTime = 3; @@ -202,24 +235,24 @@ server cluster Scenes = 5 { } response struct RemoveSceneResponse = 2 { - ENUM8 status = 0; + status status = 0; group_id groupID = 1; INT8U sceneID = 2; } response struct RemoveAllScenesResponse = 3 { - ENUM8 status = 0; + status status = 0; group_id groupID = 1; } response struct StoreSceneResponse = 4 { - ENUM8 status = 0; + status status = 0; group_id groupID = 1; INT8U sceneID = 2; } response struct GetSceneMembershipResponse = 6 { - ENUM8 status = 0; + status status = 0; nullable INT8U capacity = 1; group_id groupID = 2; optional INT8U sceneList[] = 3; @@ -257,12 +290,12 @@ server cluster OnOff = 6 { kTogglePreviousOnOff = 2; } - bitmap OnOffControl : BITMAP8 { - kAcceptOnlyWhenOn = 0x1; + bitmap Feature : BITMAP32 { + kLighting = 0x1; } - bitmap OnOffFeature : BITMAP32 { - kLighting = 0x1; + bitmap OnOffControl : BITMAP8 { + kAcceptOnlyWhenOn = 0x1; } readonly nosubscribe attribute boolean onOff = 0; @@ -315,25 +348,6 @@ server cluster Descriptor = 29 { readonly attribute int16u clusterRevision = 65533; } -/** The Binding Cluster is meant to replace the support from the Zigbee Device Object (ZDO) for supporting the binding table. */ -client cluster Binding = 30 { - fabric_scoped struct TargetStruct { - optional node_id node = 1; - optional group_id group = 2; - optional endpoint_no endpoint = 3; - optional cluster_id cluster = 4; - fabric_idx fabricIndex = 254; - } - - attribute TargetStruct binding[] = 0; - readonly attribute command_id generatedCommandList[] = 65528; - readonly attribute command_id acceptedCommandList[] = 65529; - readonly attribute event_id eventList[] = 65530; - readonly attribute attrib_id attributeList[] = 65531; - readonly attribute bitmap32 featureMap = 65532; - readonly attribute int16u clusterRevision = 65533; -} - /** The Binding Cluster is meant to replace the support from the Zigbee Device Object (ZDO) for supporting the binding table. */ server cluster Binding = 30 { fabric_scoped struct TargetStruct { @@ -359,8 +373,8 @@ server cluster Binding = 30 { cluster instances. */ server cluster AccessControl = 31 { enum AccessControlEntryAuthModeEnum : ENUM8 { - kPase = 1; - kCase = 2; + kPASE = 1; + kCASE = 2; kGroup = 3; } @@ -378,20 +392,20 @@ server cluster AccessControl = 31 { kRemoved = 2; } + struct AccessControlTargetStruct { + nullable cluster_id cluster = 0; + nullable endpoint_no endpoint = 1; + nullable devtype_id deviceType = 2; + } + fabric_scoped struct AccessControlEntryStruct { fabric_sensitive AccessControlEntryPrivilegeEnum privilege = 1; fabric_sensitive AccessControlEntryAuthModeEnum authMode = 2; nullable fabric_sensitive int64u subjects[] = 3; - nullable fabric_sensitive Target targets[] = 4; + nullable fabric_sensitive AccessControlTargetStruct targets[] = 4; fabric_idx fabricIndex = 254; } - struct Target { - nullable cluster_id cluster = 0; - nullable endpoint_no endpoint = 1; - nullable devtype_id deviceType = 2; - } - fabric_scoped struct AccessControlExtensionStruct { fabric_sensitive octet_string<128> data = 1; fabric_idx fabricIndex = 254; @@ -430,11 +444,49 @@ server cluster AccessControl = 31 { Commissioning and operational determination of Node characteristics, such as Vendor ID, Product ID and serial number, which apply to the whole Node. Also allows setting user device information such as location. */ server cluster BasicInformation = 40 { + enum ColorEnum : ENUM8 { + kBlack = 0; + kNavy = 1; + kGreen = 2; + kTeal = 3; + kMaroon = 4; + kPurple = 5; + kOlive = 6; + kGray = 7; + kBlue = 8; + kLime = 9; + kAqua = 10; + kRed = 11; + kFuchsia = 12; + kYellow = 13; + kWhite = 14; + kNickel = 15; + kChrome = 16; + kBrass = 17; + kCopper = 18; + kSilver = 19; + kGold = 20; + } + + enum ProductFinishEnum : ENUM8 { + kOther = 0; + kMatte = 1; + kSatin = 2; + kPolished = 3; + kRugged = 4; + kFabric = 5; + } + struct CapabilityMinimaStruct { int16u caseSessionsPerFabric = 0; int16u subscriptionsPerFabric = 1; } + struct ProductAppearanceStruct { + ProductFinishEnum finish = 0; + nullable ColorEnum primaryColor = 1; + } + critical event StartUp = 0 { INT32U softwareVersion = 0; } @@ -489,7 +541,7 @@ server cluster OtaSoftwareUpdateProvider = 41 { enum OTADownloadProtocol : ENUM8 { kBDXSynchronous = 0; kBDXAsynchronous = 1; - kHttps = 2; + kHTTPS = 2; kVendorSpecific = 3; } @@ -611,7 +663,7 @@ server cluster UnitLocalization = 45 { kKelvin = 2; } - bitmap UnitLocalizationFeature : BITMAP32 { + bitmap Feature : BITMAP32 { kTemperatureUnit = 0x1; } @@ -624,84 +676,17 @@ server cluster UnitLocalization = 45 { readonly attribute int16u clusterRevision = 65533; } -/** This cluster is used to manage global aspects of the Commissioning flow. */ -client cluster GeneralCommissioning = 48 { - enum CommissioningError : ENUM8 { - kOk = 0; - kValueOutsideRange = 1; - kInvalidAuthentication = 2; - kNoFailSafe = 3; - kBusyWithOtherAdmin = 4; - } - - enum RegulatoryLocationType : ENUM8 { - kIndoor = 0; - kOutdoor = 1; - kIndoorOutdoor = 2; - } - - struct BasicCommissioningInfo { - int16u failSafeExpiryLengthSeconds = 0; - int16u maxCumulativeFailsafeSeconds = 1; - } - - attribute access(write: administer) int64u breadcrumb = 0; - readonly attribute BasicCommissioningInfo basicCommissioningInfo = 1; - readonly attribute RegulatoryLocationType regulatoryConfig = 2; - readonly attribute RegulatoryLocationType locationCapability = 3; - readonly attribute boolean supportsConcurrentConnection = 4; - readonly attribute command_id generatedCommandList[] = 65528; - readonly attribute command_id acceptedCommandList[] = 65529; - readonly attribute event_id eventList[] = 65530; - readonly attribute attrib_id attributeList[] = 65531; - readonly attribute bitmap32 featureMap = 65532; - readonly attribute int16u clusterRevision = 65533; - - request struct ArmFailSafeRequest { - INT16U expiryLengthSeconds = 0; - INT64U breadcrumb = 1; - } - - response struct ArmFailSafeResponse = 1 { - CommissioningError errorCode = 0; - CHAR_STRING debugText = 1; - } - - request struct SetRegulatoryConfigRequest { - RegulatoryLocationType newRegulatoryConfig = 0; - CHAR_STRING countryCode = 1; - INT64U breadcrumb = 2; - } - - response struct SetRegulatoryConfigResponse = 3 { - CommissioningError errorCode = 0; - CHAR_STRING debugText = 1; - } - - response struct CommissioningCompleteResponse = 5 { - CommissioningError errorCode = 0; - CHAR_STRING debugText = 1; - } - - /** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */ - command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0; - /** Set the regulatory configuration to be used during commissioning */ - command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2; - /** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */ - fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4; -} - /** This cluster is used to manage global aspects of the Commissioning flow. */ server cluster GeneralCommissioning = 48 { - enum CommissioningError : ENUM8 { - kOk = 0; + enum CommissioningErrorEnum : ENUM8 { + kOK = 0; kValueOutsideRange = 1; kInvalidAuthentication = 2; kNoFailSafe = 3; kBusyWithOtherAdmin = 4; } - enum RegulatoryLocationType : ENUM8 { + enum RegulatoryLocationTypeEnum : ENUM8 { kIndoor = 0; kOutdoor = 1; kIndoorOutdoor = 2; @@ -714,8 +699,8 @@ server cluster GeneralCommissioning = 48 { attribute access(write: administer) int64u breadcrumb = 0; readonly attribute BasicCommissioningInfo basicCommissioningInfo = 1; - readonly attribute RegulatoryLocationType regulatoryConfig = 2; - readonly attribute RegulatoryLocationType locationCapability = 3; + readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2; + readonly attribute RegulatoryLocationTypeEnum locationCapability = 3; readonly attribute boolean supportsConcurrentConnection = 4; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; @@ -730,23 +715,23 @@ server cluster GeneralCommissioning = 48 { } request struct SetRegulatoryConfigRequest { - RegulatoryLocationType newRegulatoryConfig = 0; + RegulatoryLocationTypeEnum newRegulatoryConfig = 0; CHAR_STRING countryCode = 1; INT64U breadcrumb = 2; } response struct ArmFailSafeResponse = 1 { - CommissioningError errorCode = 0; + CommissioningErrorEnum errorCode = 0; CHAR_STRING debugText = 1; } response struct SetRegulatoryConfigResponse = 3 { - CommissioningError errorCode = 0; + CommissioningErrorEnum errorCode = 0; CHAR_STRING debugText = 1; } response struct CommissioningCompleteResponse = 5 { - CommissioningError errorCode = 0; + CommissioningErrorEnum errorCode = 0; CHAR_STRING debugText = 1; } @@ -756,8 +741,8 @@ server cluster GeneralCommissioning = 48 { } /** Functionality to configure, enable, disable network credentials and access on a Matter device. */ -client cluster NetworkCommissioning = 49 { - enum NetworkCommissioningStatus : ENUM8 { +server cluster NetworkCommissioning = 49 { + enum NetworkCommissioningStatusEnum : ENUM8 { kSuccess = 0; kOutOfRange = 1; kBoundsExceeded = 2; @@ -773,34 +758,35 @@ client cluster NetworkCommissioning = 49 { kUnknownError = 12; } - enum WiFiBand : ENUM8 { - k2g4 = 0; - k3g65 = 1; - k5g = 2; - k6g = 3; - k60g = 4; + enum WiFiBandEnum : ENUM8 { + k2G4 = 0; + k3G65 = 1; + k5G = 2; + k6G = 3; + k60G = 4; + k1G = 5; } - bitmap NetworkCommissioningFeature : BITMAP32 { + bitmap Feature : BITMAP32 { kWiFiNetworkInterface = 0x1; kThreadNetworkInterface = 0x2; kEthernetNetworkInterface = 0x4; } - bitmap WiFiSecurity : BITMAP8 { + bitmap WiFiSecurityBitmap : BITMAP8 { kUnencrypted = 0x1; - kWep = 0x2; - kWpaPersonal = 0x4; - kWpa2Personal = 0x8; - kWpa3Personal = 0x10; + kWEP = 0x2; + kWPAPersonal = 0x4; + kWPA2Personal = 0x8; + kWPA3Personal = 0x10; } - struct NetworkInfo { + struct NetworkInfoStruct { octet_string<32> networkID = 0; boolean connected = 1; } - struct ThreadInterfaceScanResult { + struct ThreadInterfaceScanResultStruct { int16u panId = 0; int64u extendedPanId = 1; char_string<16> networkName = 2; @@ -811,166 +797,21 @@ client cluster NetworkCommissioning = 49 { int8u lqi = 7; } - struct WiFiInterfaceScanResult { - WiFiSecurity security = 0; - octet_string<32> ssid = 1; - octet_string<6> bssid = 2; - int16u channel = 3; - WiFiBand wiFiBand = 4; - int8s rssi = 5; - } - - readonly attribute access(read: administer) int8u maxNetworks = 0; - readonly attribute access(read: administer) NetworkInfo networks[] = 1; - readonly attribute optional int8u scanMaxTimeSeconds = 2; - readonly attribute optional int8u connectMaxTimeSeconds = 3; - attribute access(write: administer) boolean interfaceEnabled = 4; - readonly attribute access(read: administer) nullable NetworkCommissioningStatus lastNetworkingStatus = 5; - readonly attribute access(read: administer) nullable octet_string<32> lastNetworkID = 6; - readonly attribute access(read: administer) nullable int32s lastConnectErrorValue = 7; - readonly attribute command_id generatedCommandList[] = 65528; - readonly attribute command_id acceptedCommandList[] = 65529; - readonly attribute event_id eventList[] = 65530; - readonly attribute attrib_id attributeList[] = 65531; - readonly attribute bitmap32 featureMap = 65532; - readonly attribute int16u clusterRevision = 65533; - - request struct ScanNetworksRequest { - optional nullable OCTET_STRING<32> ssid = 0; - optional INT64U breadcrumb = 1; - } - - response struct ScanNetworksResponse = 1 { - NetworkCommissioningStatus networkingStatus = 0; - optional CHAR_STRING debugText = 1; - optional WiFiInterfaceScanResult wiFiScanResults[] = 2; - optional ThreadInterfaceScanResult threadScanResults[] = 3; - } - - request struct AddOrUpdateWiFiNetworkRequest { - OCTET_STRING<32> ssid = 0; - OCTET_STRING<64> credentials = 1; - optional INT64U breadcrumb = 2; - } - - request struct AddOrUpdateThreadNetworkRequest { - OCTET_STRING<254> operationalDataset = 0; - optional INT64U breadcrumb = 1; - } - - request struct RemoveNetworkRequest { - OCTET_STRING<32> networkID = 0; - optional INT64U breadcrumb = 1; - } - - response struct NetworkConfigResponse = 5 { - NetworkCommissioningStatus networkingStatus = 0; - optional CHAR_STRING<512> debugText = 1; - optional INT8U networkIndex = 2; - } - - request struct ConnectNetworkRequest { - OCTET_STRING<32> networkID = 0; - optional INT64U breadcrumb = 1; - } - - response struct ConnectNetworkResponse = 7 { - NetworkCommissioningStatus networkingStatus = 0; - optional CHAR_STRING debugText = 1; - nullable INT32S errorValue = 2; - } - - request struct ReorderNetworkRequest { - OCTET_STRING<32> networkID = 0; - INT8U networkIndex = 1; - optional INT64U breadcrumb = 2; - } - - /** Detemine the set of networks the device sees as available. */ - command access(invoke: administer) ScanNetworks(ScanNetworksRequest): ScanNetworksResponse = 0; - /** Add or update the credentials for a given Wi-Fi network. */ - command access(invoke: administer) AddOrUpdateWiFiNetwork(AddOrUpdateWiFiNetworkRequest): NetworkConfigResponse = 2; - /** Add or update the credentials for a given Thread network. */ - command access(invoke: administer) AddOrUpdateThreadNetwork(AddOrUpdateThreadNetworkRequest): NetworkConfigResponse = 3; - /** Remove the definition of a given network (including its credentials). */ - command access(invoke: administer) RemoveNetwork(RemoveNetworkRequest): NetworkConfigResponse = 4; - /** Connect to the specified network, using previously-defined credentials. */ - command access(invoke: administer) ConnectNetwork(ConnectNetworkRequest): ConnectNetworkResponse = 6; - /** Modify the order in which networks will be presented in the Networks attribute. */ - command access(invoke: administer) ReorderNetwork(ReorderNetworkRequest): NetworkConfigResponse = 8; -} - -/** Functionality to configure, enable, disable network credentials and access on a Matter device. */ -server cluster NetworkCommissioning = 49 { - enum NetworkCommissioningStatus : ENUM8 { - kSuccess = 0; - kOutOfRange = 1; - kBoundsExceeded = 2; - kNetworkIDNotFound = 3; - kDuplicateNetworkID = 4; - kNetworkNotFound = 5; - kRegulatoryError = 6; - kAuthFailure = 7; - kUnsupportedSecurity = 8; - kOtherConnectionFailure = 9; - kIPV6Failed = 10; - kIPBindFailed = 11; - kUnknownError = 12; - } - - enum WiFiBand : ENUM8 { - k2g4 = 0; - k3g65 = 1; - k5g = 2; - k6g = 3; - k60g = 4; - } - - bitmap NetworkCommissioningFeature : BITMAP32 { - kWiFiNetworkInterface = 0x1; - kThreadNetworkInterface = 0x2; - kEthernetNetworkInterface = 0x4; - } - - bitmap WiFiSecurity : BITMAP8 { - kUnencrypted = 0x1; - kWep = 0x2; - kWpaPersonal = 0x4; - kWpa2Personal = 0x8; - kWpa3Personal = 0x10; - } - - struct NetworkInfo { - octet_string<32> networkID = 0; - boolean connected = 1; - } - - struct WiFiInterfaceScanResult { - WiFiSecurity security = 0; + struct WiFiInterfaceScanResultStruct { + WiFiSecurityBitmap security = 0; octet_string<32> ssid = 1; octet_string<6> bssid = 2; int16u channel = 3; - WiFiBand wiFiBand = 4; + WiFiBandEnum wiFiBand = 4; int8s rssi = 5; } - struct ThreadInterfaceScanResult { - int16u panId = 0; - int64u extendedPanId = 1; - char_string<16> networkName = 2; - int16u channel = 3; - int8u version = 4; - octet_string<8> extendedAddress = 5; - int8s rssi = 6; - int8u lqi = 7; - } - readonly attribute access(read: administer) int8u maxNetworks = 0; - readonly attribute access(read: administer) NetworkInfo networks[] = 1; + readonly attribute access(read: administer) NetworkInfoStruct networks[] = 1; readonly attribute int8u scanMaxTimeSeconds = 2; readonly attribute int8u connectMaxTimeSeconds = 3; attribute access(write: administer) boolean interfaceEnabled = 4; - readonly attribute access(read: administer) nullable NetworkCommissioningStatus lastNetworkingStatus = 5; + readonly attribute access(read: administer) nullable NetworkCommissioningStatusEnum lastNetworkingStatus = 5; readonly attribute access(read: administer) nullable octet_string<32> lastNetworkID = 6; readonly attribute access(read: administer) nullable int32s lastConnectErrorValue = 7; readonly attribute command_id generatedCommandList[] = 65528; @@ -1013,20 +854,20 @@ server cluster NetworkCommissioning = 49 { } response struct ScanNetworksResponse = 1 { - NetworkCommissioningStatus networkingStatus = 0; + NetworkCommissioningStatusEnum networkingStatus = 0; optional CHAR_STRING debugText = 1; - optional WiFiInterfaceScanResult wiFiScanResults[] = 2; - optional ThreadInterfaceScanResult threadScanResults[] = 3; + optional WiFiInterfaceScanResultStruct wiFiScanResults[] = 2; + optional ThreadInterfaceScanResultStruct threadScanResults[] = 3; } response struct NetworkConfigResponse = 5 { - NetworkCommissioningStatus networkingStatus = 0; + NetworkCommissioningStatusEnum networkingStatus = 0; optional CHAR_STRING<512> debugText = 1; optional INT8U networkIndex = 2; } response struct ConnectNetworkResponse = 7 { - NetworkCommissioningStatus networkingStatus = 0; + NetworkCommissioningStatusEnum networkingStatus = 0; optional CHAR_STRING debugText = 1; nullable INT32S errorValue = 2; } @@ -1057,7 +898,7 @@ server cluster DiagnosticLogs = 50 { enum TransferProtocolEnum : ENUM8 { kResponsePayload = 0; - kBdx = 1; + kBDX = 1; } readonly attribute command_id generatedCommandList[] = 65528; @@ -1183,7 +1024,7 @@ server cluster GeneralDiagnostics = 51 { /** The Software Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */ server cluster SoftwareDiagnostics = 52 { - bitmap SoftwareDiagnosticsFeature : BITMAP32 { + bitmap Feature : BITMAP32 { kWaterMarks = 0x1; } @@ -1220,31 +1061,31 @@ server cluster ThreadNetworkDiagnostics = 53 { kNotConnected = 1; } - enum NetworkFault : ENUM8 { + enum NetworkFaultEnum : ENUM8 { kUnspecified = 0; kLinkDown = 1; kHardwareFailure = 2; kNetworkJammed = 3; } - enum RoutingRole : ENUM8 { + enum RoutingRoleEnum : ENUM8 { kUnspecified = 0; kUnassigned = 1; kSleepyEndDevice = 2; kEndDevice = 3; - kReed = 4; + kREED = 4; kRouter = 5; kLeader = 6; } - bitmap ThreadNetworkDiagnosticsFeature : BITMAP32 { + bitmap Feature : BITMAP32 { kPacketCounts = 0x1; kErrorCounts = 0x2; kMLECounts = 0x4; kMACCounts = 0x8; } - struct NeighborTable { + struct NeighborTableStruct { int64u extAddress = 0; int32u age = 1; int16u rloc16 = 2; @@ -1261,7 +1102,22 @@ server cluster ThreadNetworkDiagnostics = 53 { boolean isChild = 13; } - struct RouteTable { + struct OperationalDatasetComponents { + boolean activeTimestampPresent = 0; + boolean pendingTimestampPresent = 1; + boolean masterKeyPresent = 2; + boolean networkNamePresent = 3; + boolean extendedPanIdPresent = 4; + boolean meshLocalPrefixPresent = 5; + boolean delayPresent = 6; + boolean panIdPresent = 7; + boolean channelPresent = 8; + boolean pskcPresent = 9; + boolean securityPolicyPresent = 10; + boolean channelMaskPresent = 11; + } + + struct RouteTableStruct { int64u extAddress = 0; int16u rloc16 = 1; int8u routerId = 2; @@ -1279,39 +1135,24 @@ server cluster ThreadNetworkDiagnostics = 53 { int16u flags = 1; } - struct OperationalDatasetComponents { - boolean activeTimestampPresent = 0; - boolean pendingTimestampPresent = 1; - boolean masterKeyPresent = 2; - boolean networkNamePresent = 3; - boolean extendedPanIdPresent = 4; - boolean meshLocalPrefixPresent = 5; - boolean delayPresent = 6; - boolean panIdPresent = 7; - boolean channelPresent = 8; - boolean pskcPresent = 9; - boolean securityPolicyPresent = 10; - boolean channelMaskPresent = 11; - } - info event ConnectionStatus = 0 { ConnectionStatusEnum connectionStatus = 0; } info event NetworkFaultChange = 1 { - NetworkFault current[] = 0; - NetworkFault previous[] = 1; + NetworkFaultEnum current[] = 0; + NetworkFaultEnum previous[] = 1; } readonly attribute nullable int16u channel = 0; - readonly attribute nullable RoutingRole routingRole = 1; + readonly attribute nullable RoutingRoleEnum routingRole = 1; readonly attribute nullable char_string<16> networkName = 2; readonly attribute nullable int16u panId = 3; readonly attribute nullable int64u extendedPanId = 4; readonly attribute nullable octet_string<17> meshLocalPrefix = 5; readonly attribute int64u overrunCount = 6; - readonly attribute NeighborTable neighborTable[] = 7; - readonly attribute RouteTable routeTable[] = 8; + readonly attribute NeighborTableStruct neighborTable[] = 7; + readonly attribute RouteTableStruct routeTable[] = 8; readonly attribute nullable int32u partitionId = 9; readonly attribute nullable int8u weighting = 10; readonly attribute nullable int8u dataVersion = 11; @@ -1365,7 +1206,7 @@ server cluster ThreadNetworkDiagnostics = 53 { readonly attribute nullable SecurityPolicy securityPolicy = 59; readonly attribute nullable octet_string<4> channelPage0Mask = 60; readonly attribute nullable OperationalDatasetComponents operationalDatasetComponents = 61; - readonly attribute NetworkFault activeNetworkFaultsList[] = 62; + readonly attribute NetworkFaultEnum activeNetworkFaultsList[] = 62; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -1391,10 +1232,10 @@ server cluster WiFiNetworkDiagnostics = 54 { enum SecurityTypeEnum : ENUM8 { kUnspecified = 0; kNone = 1; - kWep = 2; - kWpa = 3; - kWpa2 = 4; - kWpa3 = 5; + kWEP = 2; + kWPA = 3; + kWPA2 = 4; + kWPA3 = 5; } enum WiFiVersionEnum : ENUM8 { @@ -1404,9 +1245,10 @@ server cluster WiFiNetworkDiagnostics = 54 { kN = 3; kAc = 4; kAx = 5; + kAh = 6; } - bitmap WiFiNetworkDiagnosticsFeature : BITMAP32 { + bitmap Feature : BITMAP32 { kPacketCounts = 0x1; kErrorCounts = 0x2; } @@ -1451,7 +1293,7 @@ server cluster EthernetNetworkDiagnostics = 55 { kRate10M = 0; kRate100M = 1; kRate1G = 2; - kRate25g = 3; + kRate25G = 3; kRate5G = 4; kRate10G = 5; kRate40G = 6; @@ -1460,7 +1302,7 @@ server cluster EthernetNetworkDiagnostics = 55 { kRate400G = 9; } - bitmap EthernetNetworkDiagnosticsFeature : BITMAP32 { + bitmap Feature : BITMAP32 { kPacketCounts = 0x1; kErrorCounts = 0x2; } @@ -1526,14 +1368,14 @@ server cluster AdministratorCommissioning = 60 { } /** This cluster is used to add or remove Operational Credentials on a Commissionee or Node, as well as manage the associated Fabrics. */ -client cluster OperationalCredentials = 62 { +server cluster OperationalCredentials = 62 { enum CertificateChainTypeEnum : ENUM8 { kDACCertificate = 1; kPAICertificate = 2; } enum NodeOperationalCertStatusEnum : ENUM8 { - kOk = 0; + kOK = 0; kInvalidPublicKey = 1; kInvalidNodeOpId = 2; kInvalidNOC = 3; @@ -1577,130 +1419,6 @@ client cluster OperationalCredentials = 62 { OCTET_STRING attestationNonce = 0; } - response struct AttestationResponse = 1 { - OCTET_STRING attestationElements = 0; - OCTET_STRING attestationSignature = 1; - } - - request struct CertificateChainRequestRequest { - CertificateChainTypeEnum certificateType = 0; - } - - response struct CertificateChainResponse = 3 { - OCTET_STRING certificate = 0; - } - - request struct CSRRequestRequest { - OCTET_STRING CSRNonce = 0; - optional boolean isForUpdateNOC = 1; - } - - response struct CSRResponse = 5 { - OCTET_STRING NOCSRElements = 0; - OCTET_STRING attestationSignature = 1; - } - - request struct AddNOCRequest { - OCTET_STRING NOCValue = 0; - optional OCTET_STRING ICACValue = 1; - OCTET_STRING IPKValue = 2; - Int64u caseAdminSubject = 3; - VENDOR_ID adminVendorId = 4; - } - - request struct UpdateNOCRequest { - OCTET_STRING NOCValue = 0; - optional OCTET_STRING ICACValue = 1; - } - - response struct NOCResponse = 8 { - NodeOperationalCertStatusEnum statusCode = 0; - optional fabric_idx fabricIndex = 1; - optional CHAR_STRING debugText = 2; - } - - request struct UpdateFabricLabelRequest { - CHAR_STRING<32> label = 0; - } - - request struct RemoveFabricRequest { - fabric_idx fabricIndex = 0; - } - - request struct AddTrustedRootCertificateRequest { - OCTET_STRING rootCACertificate = 0; - } - - /** Sender is requesting attestation information from the receiver. */ - command access(invoke: administer) AttestationRequest(AttestationRequestRequest): AttestationResponse = 0; - /** Sender is requesting a device attestation certificate from the receiver. */ - command access(invoke: administer) CertificateChainRequest(CertificateChainRequestRequest): CertificateChainResponse = 2; - /** Sender is requesting a certificate signing request (CSR) from the receiver. */ - command access(invoke: administer) CSRRequest(CSRRequestRequest): CSRResponse = 4; - /** Sender is requesting to add the new node operational certificates. */ - command access(invoke: administer) AddNOC(AddNOCRequest): NOCResponse = 6; - /** Sender is requesting to update the node operational certificates. */ - fabric command access(invoke: administer) UpdateNOC(UpdateNOCRequest): NOCResponse = 7; - /** This command SHALL be used by an Administrative Node to set the user-visible Label field for a given Fabric, as reflected by entries in the Fabrics attribute. */ - fabric command access(invoke: administer) UpdateFabricLabel(UpdateFabricLabelRequest): NOCResponse = 9; - /** This command is used by Administrative Nodes to remove a given fabric index and delete all associated fabric-scoped data. */ - command access(invoke: administer) RemoveFabric(RemoveFabricRequest): NOCResponse = 10; - /** This command SHALL add a Trusted Root CA Certificate, provided as its CHIP Certificate representation. */ - command access(invoke: administer) AddTrustedRootCertificate(AddTrustedRootCertificateRequest): DefaultSuccess = 11; -} - -/** This cluster is used to add or remove Operational Credentials on a Commissionee or Node, as well as manage the associated Fabrics. */ -server cluster OperationalCredentials = 62 { - enum CertificateChainTypeEnum : ENUM8 { - kDACCertificate = 1; - kPAICertificate = 2; - } - - enum NodeOperationalCertStatusEnum : ENUM8 { - kOk = 0; - kInvalidPublicKey = 1; - kInvalidNodeOpId = 2; - kInvalidNOC = 3; - kMissingCsr = 4; - kTableFull = 5; - kInvalidAdminSubject = 6; - kFabricConflict = 9; - kLabelConflict = 10; - kInvalidFabricIndex = 11; - } - - fabric_scoped struct NOCStruct { - fabric_sensitive octet_string noc = 1; - nullable fabric_sensitive octet_string icac = 2; - fabric_idx fabricIndex = 254; - } - - fabric_scoped struct FabricDescriptorStruct { - octet_string<65> rootPublicKey = 1; - vendor_id vendorID = 2; - fabric_id fabricID = 3; - node_id nodeID = 4; - char_string<32> label = 5; - fabric_idx fabricIndex = 254; - } - - readonly attribute access(read: administer) NOCStruct NOCs[] = 0; - readonly attribute FabricDescriptorStruct fabrics[] = 1; - readonly attribute int8u supportedFabrics = 2; - readonly attribute int8u commissionedFabrics = 3; - readonly attribute OCTET_STRING trustedRootCertificates[] = 4; - readonly attribute int8u currentFabricIndex = 5; - readonly attribute command_id generatedCommandList[] = 65528; - readonly attribute command_id acceptedCommandList[] = 65529; - readonly attribute event_id eventList[] = 65530; - readonly attribute attrib_id attributeList[] = 65531; - readonly attribute bitmap32 featureMap = 65532; - readonly attribute int16u clusterRevision = 65533; - - request struct AttestationRequestRequest { - OCTET_STRING attestationNonce = 0; - } - request struct CertificateChainRequestRequest { CertificateChainTypeEnum certificateType = 0; } @@ -1772,16 +1490,16 @@ server cluster GroupKeyManagement = 63 { kCacheAndSync = 1; } - fabric_scoped struct GroupKeyMapStruct { + fabric_scoped struct GroupInfoMapStruct { group_id groupId = 1; - int16u groupKeySetID = 2; + endpoint_no endpoints[] = 2; + optional char_string<16> groupName = 3; fabric_idx fabricIndex = 254; } - fabric_scoped struct GroupInfoMapStruct { + fabric_scoped struct GroupKeyMapStruct { group_id groupId = 1; - endpoint_no endpoints[] = 2; - optional char_string<16> groupName = 3; + int16u groupKeySetID = 2; fabric_idx fabricIndex = 254; } @@ -1819,10 +1537,6 @@ server cluster GroupKeyManagement = 63 { INT16U groupKeySetID = 0; } - request struct KeySetReadAllIndicesRequest { - INT16U groupKeySetIDs[] = 0; - } - response struct KeySetReadResponse = 2 { GroupKeySetStruct groupKeySet = 0; } @@ -1834,12 +1548,17 @@ server cluster GroupKeyManagement = 63 { fabric command access(invoke: administer) KeySetWrite(KeySetWriteRequest): DefaultSuccess = 0; fabric command access(invoke: administer) KeySetRead(KeySetReadRequest): KeySetReadResponse = 1; fabric command access(invoke: administer) KeySetRemove(KeySetRemoveRequest): DefaultSuccess = 3; - fabric command access(invoke: administer) KeySetReadAllIndices(KeySetReadAllIndicesRequest): KeySetReadAllIndicesResponse = 4; + fabric command access(invoke: administer) KeySetReadAllIndices(): KeySetReadAllIndicesResponse = 4; } /** The Fixed Label Cluster provides a feature for the device to tag an endpoint with zero or more read only labels. */ server cluster FixedLabel = 64 { + struct LabelStruct { + char_string<16> label = 0; + char_string<16> value = 1; + } + readonly attribute LabelStruct labelList[] = 0; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; @@ -1851,6 +1570,11 @@ server cluster FixedLabel = 64 { /** The User Label Cluster provides a feature to tag an endpoint with zero or more labels. */ server cluster UserLabel = 65 { + struct LabelStruct { + char_string<16> label = 0; + char_string<16> value = 1; + } + attribute access(write: manage) LabelStruct labelList[] = 0; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; @@ -1862,10 +1586,6 @@ server cluster UserLabel = 65 { endpoint 0 { device type rootdevice = 22, version 1; - binding cluster Binding; - binding cluster GeneralCommissioning; - binding cluster NetworkCommissioning; - binding cluster OperationalCredentials; server cluster Descriptor { callback attribute deviceTypeList; @@ -2153,9 +1873,6 @@ endpoint 1 { server cluster Identify { ram attribute identifyTime default = 0x0; ram attribute identifyType default = 0x0; - callback attribute generatedCommandList; - callback attribute acceptedCommandList; - callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 2; } @@ -2170,14 +1887,13 @@ endpoint 1 { } server cluster Scenes { - ram attribute sceneCount default = 0x00; + callback attribute sceneCount default = 0x00; ram attribute currentScene default = 0x00; ram attribute currentGroup default = 0x0000; ram attribute sceneValid default = 0x00; ram attribute nameSupport; - callback attribute generatedCommandList; - callback attribute acceptedCommandList; - callback attribute attributeList; + ram attribute sceneTableSize; + callback attribute remainingCapacity; ram attribute featureMap default = 0; ram attribute clusterRevision default = 3; } @@ -2200,9 +1916,6 @@ endpoint 1 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - callback attribute generatedCommandList; - callback attribute acceptedCommandList; - callback attribute attributeList; ram attribute featureMap default = 0; callback attribute clusterRevision default = 1; } diff --git a/examples/st-device-app/st-device-common/st-device-app.zap b/examples/st-device-app/st-device-common/st-device-app.zap index 0ac09dd1ae0d2f..e871563315571b 100644 --- a/examples/st-device-app/st-device-common/st-device-app.zap +++ b/examples/st-device-app/st-device-common/st-device-app.zap @@ -1,5 +1,5 @@ { - "featureLevel": 95, + "featureLevel": 96, "creator": "zap", "keyValuePairs": [ { @@ -239,7 +239,7 @@ "code": 0, "mfgCode": null, "side": "server", - "type": "bitmap8", + "type": "NameSupportBitmap", "included": 1, "storageOption": "RAM", "singleton": 0, @@ -417,7 +417,7 @@ "side": "server", "type": "int8u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "0x00", @@ -874,7 +874,7 @@ "mfgCode": null, "define": "BINDING_CLUSTER", "side": "client", - "enabled": 1, + "enabled": 0, "attributes": [ { "name": "ClusterRevision", @@ -1889,7 +1889,7 @@ "mfgCode": null, "define": "GENERAL_COMMISSIONING_CLUSTER", "side": "client", - "enabled": 1, + "enabled": 0, "commands": [ { "name": "ArmFailSafe", @@ -2006,7 +2006,7 @@ "code": 2, "mfgCode": null, "side": "server", - "type": "RegulatoryLocationType", + "type": "RegulatoryLocationTypeEnum", "included": 1, "storageOption": "External", "singleton": 0, @@ -2022,7 +2022,7 @@ "code": 3, "mfgCode": null, "side": "server", - "type": "RegulatoryLocationType", + "type": "RegulatoryLocationTypeEnum", "included": 1, "storageOption": "External", "singleton": 0, @@ -2089,7 +2089,7 @@ "mfgCode": null, "define": "NETWORK_COMMISSIONING_CLUSTER", "side": "client", - "enabled": 1, + "enabled": 0, "commands": [ { "name": "ScanNetworks", @@ -2294,7 +2294,7 @@ "code": 5, "mfgCode": null, "side": "server", - "type": "NetworkCommissioningStatus", + "type": "NetworkCommissioningStatusEnum", "included": 1, "storageOption": "RAM", "singleton": 0, @@ -2850,7 +2850,7 @@ "code": 1, "mfgCode": null, "side": "server", - "type": "RoutingRole", + "type": "RoutingRoleEnum", "included": 1, "storageOption": "External", "singleton": 0, @@ -4656,7 +4656,7 @@ "mfgCode": null, "define": "OPERATIONAL_CREDENTIALS_CLUSTER", "side": "client", - "enabled": 1, + "enabled": 0, "commands": [ { "name": "AttestationRequest", @@ -7097,7 +7097,7 @@ "code": 1, "mfgCode": null, "side": "server", - "type": "enum8", + "type": "IdentifyTypeEnum", "included": 1, "storageOption": "RAM", "singleton": 0, @@ -7114,7 +7114,7 @@ "mfgCode": null, "side": "server", "type": "array", - "included": 1, + "included": 0, "storageOption": "External", "singleton": 0, "bounded": 0, @@ -7130,7 +7130,7 @@ "mfgCode": null, "side": "server", "type": "array", - "included": 1, + "included": 0, "storageOption": "External", "singleton": 0, "bounded": 0, @@ -7146,7 +7146,7 @@ "mfgCode": null, "side": "server", "type": "array", - "included": 1, + "included": 0, "storageOption": "External", "singleton": 0, "bounded": 0, @@ -7329,7 +7329,7 @@ "code": 0, "mfgCode": null, "side": "server", - "type": "bitmap8", + "type": "NameSupportBitmap", "included": 1, "storageOption": "RAM", "singleton": 0, @@ -7587,7 +7587,7 @@ "side": "server", "type": "int8u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "0x00", @@ -7676,13 +7676,45 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "SceneTableSize", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "RemainingCapacity", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "GeneratedCommandList", "code": 65528, "mfgCode": null, "side": "server", "type": "array", - "included": 1, + "included": 0, "storageOption": "External", "singleton": 0, "bounded": 0, @@ -7698,7 +7730,7 @@ "mfgCode": null, "side": "server", "type": "array", - "included": 1, + "included": 0, "storageOption": "External", "singleton": 0, "bounded": 0, @@ -7714,7 +7746,7 @@ "mfgCode": null, "side": "server", "type": "array", - "included": 1, + "included": 0, "storageOption": "External", "singleton": 0, "bounded": 0, @@ -8562,7 +8594,7 @@ "mfgCode": null, "side": "server", "type": "array", - "included": 1, + "included": 0, "storageOption": "External", "singleton": 0, "bounded": 0, @@ -8578,7 +8610,7 @@ "mfgCode": null, "side": "server", "type": "array", - "included": 1, + "included": 0, "storageOption": "External", "singleton": 0, "bounded": 0, @@ -8588,13 +8620,29 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "AttributeList", "code": 65531, "mfgCode": null, "side": "server", "type": "array", - "included": 1, + "included": 0, "storageOption": "External", "singleton": 0, "bounded": 0, @@ -11699,7 +11747,7 @@ "code": 0, "mfgCode": null, "side": "server", - "type": "FanModeType", + "type": "FanModeEnum", "included": 1, "storageOption": "RAM", "singleton": 0, @@ -11715,7 +11763,7 @@ "code": 1, "mfgCode": null, "side": "server", - "type": "FanModeSequenceType", + "type": "FanModeSequenceEnum", "included": 1, "storageOption": "RAM", "singleton": 0, @@ -11731,7 +11779,7 @@ "code": 2, "mfgCode": null, "side": "server", - "type": "int8u", + "type": "Percent", "included": 1, "storageOption": "RAM", "singleton": 0, @@ -11747,7 +11795,7 @@ "code": 3, "mfgCode": null, "side": "server", - "type": "int8u", + "type": "Percent", "included": 1, "storageOption": "RAM", "singleton": 0, @@ -11811,7 +11859,7 @@ "code": 7, "mfgCode": null, "side": "server", - "type": "bitmap8", + "type": "RockBitmap", "included": 0, "storageOption": "RAM", "singleton": 0, @@ -11827,7 +11875,7 @@ "code": 8, "mfgCode": null, "side": "server", - "type": "bitmap8", + "type": "RockBitmap", "included": 0, "storageOption": "RAM", "singleton": 0, @@ -11843,7 +11891,7 @@ "code": 9, "mfgCode": null, "side": "server", - "type": "bitmap8", + "type": "WindBitmap", "included": 0, "storageOption": "RAM", "singleton": 0, @@ -11859,7 +11907,7 @@ "code": 10, "mfgCode": null, "side": "server", - "type": "bitmap8", + "type": "WindBitmap", "included": 0, "storageOption": "RAM", "singleton": 0, @@ -13077,7 +13125,7 @@ "code": 4, "mfgCode": null, "side": "server", - "type": "enum8", + "type": "LightSensorTypeEnum", "included": 0, "storageOption": "RAM", "singleton": 0, From 8705f5155ae4e2013cd52d54870d0a9d96530ff2 Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Thu, 13 Jul 2023 15:21:41 +0900 Subject: [PATCH 14/36] st-device-app: Resolve spelling check issue Signed-off-by: Jaehoon You Signed-off-by: Charles Kim --- .../st-device-common/include/CHIPProjectAppConfig.h | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h b/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h index c8d02f6ea028f9..ffcb9137a3f541 100644 --- a/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h +++ b/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h @@ -27,28 +27,20 @@ #pragma once -// TVs need to be commissioners and likely want to be discoverable #define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY 0 -// TVs that are not commissionees, -// or that don't automatically enter commissioning mode should set this to 0 #define CHIP_DEVICE_CONFIG_ENABLE_PAIRING_AUTOSTART 1 -// TVs do not typically need this - enable for debugging -// #define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT 1 - // Enable extended discovery, set timeout to 24 hours #define CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY 0 #define CHIP_DEVICE_CONFIG_EXTENDED_DISCOVERY_TIMEOUT_SECS (24 * 60 * 60) -// Advertise TV device type in DNS-SD #define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_TYPE 1 #define CHIP_DEVICE_CONFIG_DEVICE_TYPE 0 // 0x0023 = 35 = Video Player #define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID 0xFFF1 -// Include device name in discovery for casting use case #define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_NAME 1 #define CHIP_DEVICE_CONFIG_DEVICE_NAME "Matter Device" @@ -58,10 +50,5 @@ // overrides CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT in CHIPProjectConfig #define CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT 16 -// For casting, we need to allow more ACL entries, and more complex entries -#define CHIP_CONFIG_EXAMPLE_ACCESS_CONTROL_MAX_TARGETS_PER_ENTRY 20 -#define CHIP_CONFIG_EXAMPLE_ACCESS_CONTROL_MAX_SUBJECTS_PER_ENTRY 20 -#define CHIP_CONFIG_EXAMPLE_ACCESS_CONTROL_MAX_ENTRIES_PER_FABRIC 20 - // include the CHIPProjectConfig from config/standalone #include From 95fb3609ec59c230c6cb144fe6da8a35acb847ed Mon Sep 17 00:00:00 2001 From: Charles Kim Date: Thu, 20 Jul 2023 08:56:04 +0900 Subject: [PATCH 15/36] scripts: fix merge conflicts Signed-off-by: Charles Kim --- scripts/build/testdata/all_targets_linux_x64.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build/testdata/all_targets_linux_x64.txt b/scripts/build/testdata/all_targets_linux_x64.txt index 5d0c6c300018db..05f8fd0a1340b5 100644 --- a/scripts/build/testdata/all_targets_linux_x64.txt +++ b/scripts/build/testdata/all_targets_linux_x64.txt @@ -1,6 +1,6 @@ ameba-amebad-{all-clusters,all-clusters-minimal,light,light-switch,pigweed} asr-{asr582x,asr595x,asr550x}-{all-clusters,all-clusters-minimal,lighting,light-switch,lock,bridge,temperature-measurement,thermostat,ota-requestor}[-ota][-shell][-no_logging][-factory][-rotating_id][-rio] -android-{arm,arm64,x86,x64,androidstudio-arm,androidstudio-arm64,androidstudio-x86,androidstudio-x64}-{chip-tool,chip-test,tv-server,tv-casting-app,java-matter-controller}[-no-debug] +android-{arm,arm64,x86,x64,androidstudio-arm,androidstudio-arm64,androidstudio-x86,androidstudio-x64}-{chip-tool,chip-test,tv-server,tv-casting-app,java-matter-controller,virtual-device-app}[-no-debug] bouffalolab-{bl602-iot-matter-v1,bl602-night-light,xt-zb6-devkit,bl706-night-light,bl706-eth,bl704l-dvk}-light[-shell][-115200][-rpc][-cdc][-resetcnt][-rotating_device_id] cc32xx-lock ti-cc13x2x7_26x2x7-{lighting,lock,pump,pump-controller}[-mtd] From adb6cd3172f36f6a1bbacad7e06e7e0554c38d17 Mon Sep 17 00:00:00 2001 From: Charles Kim Date: Thu, 20 Jul 2023 08:59:24 +0900 Subject: [PATCH 16/36] docs: add virtual-device-app and fix merge conflicts Signed-off-by: Charles Kim --- docs/examples/index.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/examples/index.md b/docs/examples/index.md index 0ecda80b9d6a6b..4f461a6bebede7 100644 --- a/docs/examples/index.md +++ b/docs/examples/index.md @@ -78,6 +78,15 @@ darwin-framework-tool/README java-matter-controller/README ``` +## Virtual Device App example + +```{toctree} +:glob: +:maxdepth: 1 + +st-device-app/**/README +``` + ## Lighting example ```{toctree} From 041fd9bb520089f62c10a2f8ff5ed5cd1afd183b Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Fri, 14 Jul 2023 02:36:41 +0000 Subject: [PATCH 17/36] Restyled by whitespace --- examples/st-device-app/android/java/AppImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/st-device-app/android/java/AppImpl.cpp b/examples/st-device-app/android/java/AppImpl.cpp index 0863b22ea3a5bf..df85d9528e418c 100644 --- a/examples/st-device-app/android/java/AppImpl.cpp +++ b/examples/st-device-app/android/java/AppImpl.cpp @@ -100,4 +100,4 @@ CHIP_ERROR PreServerInit() Server::GetInstance().GetFabricTable().AddFabricDelegate(&gFabricDelegate); return CHIP_NO_ERROR; -} \ No newline at end of file +} From e21944a8e4b7a45bca16d94dd2de9e39e42dcb73 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Fri, 14 Jul 2023 02:36:57 +0000 Subject: [PATCH 18/36] Restyled by google-java-format --- .../matter/stdeviceapp/OnOffManager.java | 3 +- .../matter/stdeviceapp/StDeviceApp.java | 58 +++++++++---------- .../stdeviceapp/StDeviceAppCallback.java | 1 + 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/OnOffManager.java b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/OnOffManager.java index 290c7430a4f050..b2d4a175b8cca2 100644 --- a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/OnOffManager.java +++ b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/OnOffManager.java @@ -2,8 +2,7 @@ public interface OnOffManager { /** - * Notify that the OnOff value be changed by matter and should effect it. Note, - * set by TvApp will + * Notify that the OnOff value be changed by matter and should effect it. Note, set by TvApp will * also trigger this function, so must check if value is same * * @param value diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java index 3529253d3e7ee6..55ca4b0eec8249 100644 --- a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java +++ b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java @@ -20,43 +20,43 @@ import android.util.Log; public class StDeviceApp { - private StDeviceAppCallback mCallback; - private static final String TAG = "StDeviceApp"; - - public StDeviceApp(StDeviceAppCallback callback) { - mCallback = callback; - nativeInit(); - } - - private void postClusterInit(int clusterId, int endpoint) { - Log.d(TAG, "postClusterInit for " + clusterId + " at " + endpoint); - if (mCallback != null) { - mCallback.onClusterInit(this, clusterId, endpoint); - } + private StDeviceAppCallback mCallback; + private static final String TAG = "StDeviceApp"; + + public StDeviceApp(StDeviceAppCallback callback) { + mCallback = callback; + nativeInit(); + } + + private void postClusterInit(int clusterId, int endpoint) { + Log.d(TAG, "postClusterInit for " + clusterId + " at " + endpoint); + if (mCallback != null) { + mCallback.onClusterInit(this, clusterId, endpoint); } + } - private void postEvent(int event) { - Log.d(TAG, "postEvent : " + event); - if (mCallback != null) { - mCallback.onEvent(event); - } + private void postEvent(int event) { + Log.d(TAG, "postEvent : " + event); + if (mCallback != null) { + mCallback.onEvent(event); } + } - public native void nativeInit(); + public native void nativeInit(); - // called before Matter server is initiated - public native void preServerInit(); + // called before Matter server is initiated + public native void preServerInit(); - // called after Matter server is initiated - public native void postServerInit(int deviceTypeId); + // called after Matter server is initiated + public native void postServerInit(int deviceTypeId); - public native void setOnOffManager(int endpoint, OnOffManager manager); + public native void setOnOffManager(int endpoint, OnOffManager manager); - public native boolean setOnOff(int endpoint, boolean value); + public native boolean setOnOff(int endpoint, boolean value); - public native void setDACProvider(DACProvider provider); + public native void setDACProvider(DACProvider provider); - static { - System.loadLibrary("StDeviceApp"); - } + static { + System.loadLibrary("StDeviceApp"); + } } diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java index 3423b5176e45f2..18401bb3127819 100644 --- a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java +++ b/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java @@ -18,5 +18,6 @@ public interface StDeviceAppCallback { void onClusterInit(StDeviceApp app, int clusterId, int endpoint); + void onEvent(int event); } From 1928edb8e1c55be4f5a9f6f898c63032049b0ea7 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Fri, 14 Jul 2023 02:36:59 +0000 Subject: [PATCH 19/36] Restyled by clang-format --- .../st-device-app/android/java/ClusterChangeAttribute.cpp | 4 ++-- examples/st-device-app/android/java/StDeviceApp-JNI.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/st-device-app/android/java/ClusterChangeAttribute.cpp b/examples/st-device-app/android/java/ClusterChangeAttribute.cpp index 2105881893b23d..fd9c2242717bff 100644 --- a/examples/st-device-app/android/java/ClusterChangeAttribute.cpp +++ b/examples/st-device-app/android/java/ClusterChangeAttribute.cpp @@ -41,8 +41,8 @@ static void OnOffClusterAttributeChangeCallback(const app::ConcreteAttributePath void MatterPostAttributeChangeCallback(const app::ConcreteAttributePath & attributePath, uint8_t type, uint16_t size, uint8_t * value) { - ChipLogProgress(Zcl, "[ST Device] clusterId:%d,attributeId:%d,endpoint:%d", - attributePath.mClusterId, attributePath.mAttributeId, static_cast(attributePath.mEndpointId)); + ChipLogProgress(Zcl, "[ST Device] clusterId:%d,attributeId:%d,endpoint:%d", attributePath.mClusterId, + attributePath.mAttributeId, static_cast(attributePath.mEndpointId)); switch (attributePath.mClusterId) { diff --git a/examples/st-device-app/android/java/StDeviceApp-JNI.h b/examples/st-device-app/android/java/StDeviceApp-JNI.h index caf12a96b6f5e1..bac44dc1f3aec8 100644 --- a/examples/st-device-app/android/java/StDeviceApp-JNI.h +++ b/examples/st-device-app/android/java/StDeviceApp-JNI.h @@ -31,9 +31,9 @@ class StDeviceAppJNI friend StDeviceAppJNI & StDeviceAppJNIMgr(); static StDeviceAppJNI sInstance; - jobject mStDeviceAppObject = nullptr; + jobject mStDeviceAppObject = nullptr; jmethodID mPostClusterInitMethod = nullptr; - jmethodID mPostEventMethod = nullptr; + jmethodID mPostEventMethod = nullptr; }; inline class StDeviceAppJNI & StDeviceAppJNIMgr() From b847dc87d4829d1b3f766d7aaf11f84ca77e0dfc Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Fri, 14 Jul 2023 02:36:59 +0000 Subject: [PATCH 20/36] Restyled by gn --- examples/st-device-app/st-device-common/BUILD.gn | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/st-device-app/st-device-common/BUILD.gn b/examples/st-device-app/st-device-common/BUILD.gn index 67a1f0693ac472..15e4ae830a4097 100644 --- a/examples/st-device-app/st-device-common/BUILD.gn +++ b/examples/st-device-app/st-device-common/BUILD.gn @@ -20,6 +20,7 @@ import("${chip_root}/src/lib/lib.gni") chip_data_model("st-device-common") { zap_file = "st-device-app.zap" - zap_pregenerated_dir = "${chip_root}/zzz_generated/st-device-app/zap-generated" + zap_pregenerated_dir = + "${chip_root}/zzz_generated/st-device-app/zap-generated" is_server = true } From 81a4da4f1ba83a8ea4108117152ab49d7f529194 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Fri, 14 Jul 2023 02:37:01 +0000 Subject: [PATCH 21/36] Restyled by prettier-markdown --- examples/st-device-app/android/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/st-device-app/android/README.md b/examples/st-device-app/android/README.md index 5f20ca4731f52e..9fa17105288eb1 100644 --- a/examples/st-device-app/android/README.md +++ b/examples/st-device-app/android/README.md @@ -4,10 +4,10 @@ This is a Matter Android Device app that can be used as a commissionee device. This app offers the following features: -- Work as a commissionee device on Android environment -- Make custom payload information and display Matter QR code -- Provide UI for the user to change the cluster attribute values and create the cluster event - +- Work as a commissionee device on Android environment +- Make custom payload information and display Matter QR code +- Provide UI for the user to change the cluster attribute values and create + the cluster event


@@ -51,8 +51,8 @@ the top Matter directory: See the table above for other values of `TARGET_CPU`. The debug Android package `app-debug.apk` will be generated at -`out/android-$TARGET_CPU-st-device-app/outputs/apk/debug/`, and can be -installed with +`out/android-$TARGET_CPU-st-device-app/outputs/apk/debug/`, and can be installed +with ```shell adb install out/android-$TARGET_CPU-st-device-app/outputs/apk/debug/app-debug.apk From 359009701c6bd32d41c914df5674bac728a98308 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Fri, 14 Jul 2023 02:37:02 +0000 Subject: [PATCH 22/36] Restyled by shellharden --- examples/st-device-app/android/App/gradlew | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/st-device-app/android/App/gradlew b/examples/st-device-app/android/App/gradlew index 4f906e0c811fc9..3f801372727891 100755 --- a/examples/st-device-app/android/App/gradlew +++ b/examples/st-device-app/android/App/gradlew @@ -35,9 +35,9 @@ while [ -h "$PRG" ] ; do PRG=`dirname "$PRG"`"/$link" fi done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" +SAVED="$(pwd)" +cd "$(dirname \""$PRG"\")/" >/dev/null +APP_HOME="$(pwd -P)" cd "$SAVED" >/dev/null APP_NAME="Gradle" @@ -65,7 +65,7 @@ cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in +case "$(uname)" in CYGWIN* ) cygwin=true ;; @@ -112,7 +112,7 @@ if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then MAX_FD="$MAX_FD_LIMIT" fi - ulimit -n $MAX_FD + ulimit -n "$MAX_FD" if [ $? -ne 0 ] ; then warn "Could not set maximum file descriptor limit: $MAX_FD" fi @@ -122,7 +122,7 @@ if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then fi # For Darwin, add options to specify how the application appears in the dock -if $darwin; then +if "$darwin"; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi @@ -136,7 +136,7 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` SEP="" - for dir in $ROOTDIRSRAW ; do + for dir in "$ROOTDIRSRAW" ; do ROOTDIRS="$ROOTDIRS$SEP$dir" SEP="|" done @@ -151,12 +151,12 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + if [ "$CHECK" -ne 0 ] && [ "$CHECK2" -eq 0 ] ; then ### Added a condition + eval "$(echo args"$i")=$(cygpath --path --ignore --mixed "$arg")" else - eval `echo args$i`="\"$arg\"" + eval "$(echo args"$i")=\"$arg\"" fi - i=`expr $i + 1` + i=`expr "$i" + 1` done case $i in 0) set -- ;; @@ -180,6 +180,6 @@ save () { APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval set -- "$DEFAULT_JVM_OPTS" "$JAVA_OPTS" "$GRADLE_OPTS" "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" exec "$JAVACMD" "$@" From 531c25dd39e6dd823fdd0c41ff51679b7fb8cfd7 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Fri, 14 Jul 2023 02:37:03 +0000 Subject: [PATCH 23/36] Restyled by shfmt Signed-off-by: Charles Kim --- examples/st-device-app/android/App/gradlew | 87 +++++++++++----------- 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/examples/st-device-app/android/App/gradlew b/examples/st-device-app/android/App/gradlew index 3f801372727891..892bbbdad34dfe 100755 --- a/examples/st-device-app/android/App/gradlew +++ b/examples/st-device-app/android/App/gradlew @@ -26,13 +26,13 @@ # Resolve links: $0 may be a link PRG="$0" # Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then +while [ -h "$PRG" ]; do + ls=$(ls -ld "$PRG") + link=$(expr "$ls" : '.*-> \(.*\)$') + if expr "$link" : '/.*' >/dev/null; then PRG="$link" else - PRG=`dirname "$PRG"`"/$link" + PRG=$(dirname "$PRG")"/$link" fi done SAVED="$(pwd)" @@ -41,7 +41,7 @@ APP_HOME="$(pwd -P)" cd "$SAVED" >/dev/null APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=$(basename "$0") # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -49,11 +49,11 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn () { +warn() { echo "$*" } -die () { +die() { echo echo "$*" echo @@ -66,32 +66,31 @@ msys=false darwin=false nonstop=false case "$(uname)" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; + CYGWIN*) + cygwin=true + ;; + Darwin*) + darwin=true + ;; + MINGW*) + msys=true + ;; + NONSTOP*) + nonstop=true + ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - # Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +if [ -n "$JAVA_HOME" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi - if [ ! -x "$JAVACMD" ] ; then + if [ ! -x "$JAVACMD" ]; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the @@ -106,14 +105,14 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ]; then + MAX_FD_LIMIT=$(ulimit -H -n) + if [ $? -eq 0 ]; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then MAX_FD="$MAX_FD_LIMIT" fi ulimit -n "$MAX_FD" - if [ $? -ne 0 ] ; then + if [ $? -ne 0 ]; then warn "Could not set maximum file descriptor limit: $MAX_FD" fi else @@ -127,36 +126,36 @@ if "$darwin"; then fi # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` +if [ "$cygwin" = "true" -o "$msys" = "true" ]; then + APP_HOME=$(cygpath --path --mixed "$APP_HOME") + CLASSPATH=$(cygpath --path --mixed "$CLASSPATH") - JAVACMD=`cygpath --unix "$JAVACMD"` + JAVACMD=$(cygpath --unix "$JAVACMD") # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + ROOTDIRSRAW=$(find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null) SEP="" - for dir in "$ROOTDIRSRAW" ; do + for dir in "$ROOTDIRSRAW"; do ROOTDIRS="$ROOTDIRS$SEP$dir" SEP="|" done OURCYGPATTERN="(^($ROOTDIRS))" # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then + if [ "$GRADLE_CYGPATTERN" != "" ]; then OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" fi # Now convert the arguments - kludge to limit ourselves to /bin/sh i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + for arg in "$@"; do + CHECK=$(echo "$arg" | egrep -c "$OURCYGPATTERN" -) + CHECK2=$(echo "$arg" | egrep -c "^-") ### Determine if an option - if [ "$CHECK" -ne 0 ] && [ "$CHECK2" -eq 0 ] ; then ### Added a condition + if [ "$CHECK" -ne 0 ] && [ "$CHECK2" -eq 0 ]; then ### Added a condition eval "$(echo args"$i")=$(cygpath --path --ignore --mixed "$arg")" else eval "$(echo args"$i")=\"$arg\"" fi - i=`expr "$i" + 1` + i=$(expr "$i" + 1) done case $i in 0) set -- ;; @@ -173,11 +172,11 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then fi # Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done +save() { + for i; do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/"; done echo " " } -APP_ARGS=`save "$@"` +APP_ARGS=$(save "$@") # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- "$DEFAULT_JVM_OPTS" "$JAVA_OPTS" "$GRADLE_OPTS" "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" From 9e276acb14b4bf9ca4f160063605b13bbbf549d3 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Fri, 14 Jul 2023 04:53:50 +0000 Subject: [PATCH 24/36] Restyled by shellharden --- examples/st-device-app/android/App/gradlew | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/st-device-app/android/App/gradlew b/examples/st-device-app/android/App/gradlew index 892bbbdad34dfe..5cb14418047190 100755 --- a/examples/st-device-app/android/App/gradlew +++ b/examples/st-device-app/android/App/gradlew @@ -35,7 +35,7 @@ while [ -h "$PRG" ]; do PRG=$(dirname "$PRG")"/$link" fi done -SAVED="$(pwd)" +SAVED="$PWD" cd "$(dirname \""$PRG"\")/" >/dev/null APP_HOME="$(pwd -P)" cd "$SAVED" >/dev/null From 1be6845d089328f8499894117e251a035cd91966 Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Fri, 14 Jul 2023 17:12:24 +0900 Subject: [PATCH 25/36] st-device-app: Format kotlin files Signed-off-by: Jaehoon You Signed-off-by: Charles Kim --- .../ExampleInstrumentedTest.kt | 20 +- .../com/samsung/matter/chipstdeviceapp/App.kt | 11 +- .../matter/chipstdeviceapp/MainActivity.kt | 81 +++--- .../matter/chipstdeviceapp/TimberDebugTree.kt | 14 +- .../matter/chipstdeviceapp/ExampleUnitTest.kt | 13 +- .../main/java/com/samsung/buildsrc/Deps.kt | 88 +++---- .../java/com/samsung/buildsrc/Versions.kt | 10 +- .../core/common/ExampleInstrumentedTest.kt | 14 +- .../chipstdeviceapp/core/common/DeepLink.kt | 26 +- .../chipstdeviceapp/core/common/Device.kt | 60 +++-- .../core/common/MatterConstants.kt | 16 +- .../core/common/MatterSettings.kt | 6 +- .../chipstdeviceapp/core/common/QrcodeUtil.kt | 34 +-- .../chipstdeviceapp/core/common/Result.kt | 14 +- .../core/common/di/CoroutinesModule.kt | 33 ++- .../core/common/di/CoroutinesQualifiers.kt | 16 +- .../common/ui/DisableAppBarLayoutBehavior.kt | 42 ++- .../core/common/ExampleUnitTest.kt | 13 +- .../core/data/ExampleInstrumentedTest.kt | 20 +- .../core/data/di/DataModule.kt | 12 +- .../core/data/repository/MatterRepository.kt | 7 +- .../data/repository/MatterRepositoryImpl.kt | 17 +- .../core/data/repository/NetworkRepository.kt | 4 +- .../data/repository/NetworkRepositoryImpl.kt | 45 ++-- .../core/data/ExampleUnitTest.kt | 13 +- .../core/domain/ExampleInstrumentedTest.kt | 20 +- .../core/domain/CoroutineUseCase.kt | 21 +- .../core/domain/NonParamCoroutineUseCase.kt | 21 +- .../GetManualPairingCodeStringUseCase.kt | 18 +- .../usecase/matter/GetQrCodeStringUseCase.kt | 18 +- .../domain/usecase/network/GetSSIDUseCase.kt | 18 +- .../core/domain/ExampleUnitTest.kt | 13 +- .../core/matter/ExampleInstrumentedTest.kt | 20 +- .../chipstdeviceapp/core/matter/MatterApi.kt | 48 ++-- .../core/matter/model/Payload.kt | 42 +-- .../core/matter/ExampleUnitTest.kt | 13 +- .../core/model/ExampleInstrumentedTest.kt | 20 +- .../core/model/OnobardingType.kt | 10 +- .../chipstdeviceapp/core/model/Payload.kt | 6 +- .../core/model/ExampleUnitTest.kt | 13 +- .../feature/main/ExampleInstrumentedTest.kt | 20 +- .../feature/main/model/Menu.kt | 18 +- .../feature/main/ui/MainFragment.kt | 169 ++++++------ .../feature/main/ui/adapter/MenuAdapter.kt | 41 ++- .../main/ui/adapter/ViewBindingAdapter.kt | 2 +- .../ui/recyclerview/DataBindingViewHolder.kt | 15 +- .../main/ui/recyclerview/ItemDiffCallback.kt | 12 +- .../ui/recyclerview/ListBindingAdapter.kt | 25 +- .../VerticalSpaceItemDecoration.kt | 34 ++- .../feature/main/ExampleUnitTest.kt | 13 +- .../feature/qrcode/ExampleInstrumentedTest.kt | 23 +- .../feature/qrcode/QrcodeFragment.kt | 237 +++++++++-------- .../feature/qrcode/QrcodeViewModel.kt | 65 ++--- .../feature/qrcode/ExampleUnitTest.kt | 13 +- .../feature/setup/ExampleInstrumentedTest.kt | 23 +- .../feature/setup/SetupFragment.kt | 248 +++++++++--------- .../feature/setup/SetupViewModel.kt | 32 +-- .../feature/setup/ExampleUnitTest.kt | 13 +- 58 files changed, 941 insertions(+), 992 deletions(-) diff --git a/examples/st-device-app/android/App/app/src/androidTest/java/com/samsung/matter/chipstdeviceapp/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/app/src/androidTest/java/com/samsung/matter/chipstdeviceapp/ExampleInstrumentedTest.kt index 19fd38b33d2531..9dbf4b7fa841c4 100644 --- a/examples/st-device-app/android/App/app/src/androidTest/java/com/samsung/matter/chipstdeviceapp/ExampleInstrumentedTest.kt +++ b/examples/st-device-app/android/App/app/src/androidTest/java/com/samsung/matter/chipstdeviceapp/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.samsung.matter.chipstdeviceapp -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * @@ -15,10 +13,10 @@ import org.junit.Assert.* */ @RunWith(AndroidJUnit4::class) class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp", appContext.packageName) - } -} \ No newline at end of file + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/App.kt b/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/App.kt index c9951d9d841038..d97343892648ff 100644 --- a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/App.kt +++ b/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/App.kt @@ -4,12 +4,11 @@ import android.app.Application import dagger.hilt.android.HiltAndroidApp import timber.log.Timber - @HiltAndroidApp class App : Application() { - override fun onCreate() { - super.onCreate() - Timber.plant(TimberDebugTree()) - } -} \ No newline at end of file + override fun onCreate() { + super.onCreate() + Timber.plant(TimberDebugTree()) + } +} diff --git a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/MainActivity.kt b/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/MainActivity.kt index 48c18f9e7f5efb..a525b2129e8bdd 100644 --- a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/MainActivity.kt +++ b/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/MainActivity.kt @@ -14,57 +14,54 @@ import timber.log.Timber @AndroidEntryPoint class MainActivity : AppCompatActivity() { - private lateinit var binding: ActivityMainBinding + private lateinit var binding: ActivityMainBinding - private val permissions = arrayOf( - Manifest.permission.ACCESS_FINE_LOCATION - ) + private val permissions = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION) - private val requestMultiplePermissions = - registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions -> - permissions.entries.forEach { - Timber.d("${it.key}:${it.value}") - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - Timber.d("onCreate()") + private val requestMultiplePermissions = + registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions -> + permissions.entries.forEach { Timber.d("${it.key}:${it.value}") } + } - val isPermissionsGranted = permissions.all { - ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED - } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Timber.d("onCreate()") - if (!isPermissionsGranted) { - requestMultiplePermissions.launch(permissions) - } + val isPermissionsGranted = + permissions.all { + ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED + } - binding = ActivityMainBinding.inflate(layoutInflater) - setContentView(binding.root) + if (!isPermissionsGranted) { + requestMultiplePermissions.launch(permissions) } - override fun onDestroy() { - super.onDestroy() - Timber.d("onDestroy()") - } + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - android.R.id.home -> { - onBackPressed() - return true - } - } + override fun onDestroy() { + super.onDestroy() + Timber.d("onDestroy()") + } - return super.onOptionsItemSelected(item) + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> { + onBackPressed() + return true + } } - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - Timber.d("RequestCode:$requestCode") - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - } + return super.onOptionsItemSelected(item) + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + Timber.d("RequestCode:$requestCode") + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + } } diff --git a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/TimberDebugTree.kt b/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/TimberDebugTree.kt index bcebead8a63e63..776f147aef6890 100644 --- a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/TimberDebugTree.kt +++ b/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/TimberDebugTree.kt @@ -3,11 +3,11 @@ package com.samsung.matter.chipstdeviceapp import timber.log.Timber class TimberDebugTree : Timber.DebugTree() { - override fun createStackElementTag(element: StackTraceElement): String { - return if (BuildConfig.DEBUG) { - "[STD]:${element.fileName}:${element.lineNumber}#${element.methodName}" - } else { - "[STD]:${element.className}#${element.methodName}" - } + override fun createStackElementTag(element: StackTraceElement): String { + return if (BuildConfig.DEBUG) { + "[STD]:${element.fileName}:${element.lineNumber}#${element.methodName}" + } else { + "[STD]:${element.className}#${element.methodName}" } -} \ No newline at end of file + } +} diff --git a/examples/st-device-app/android/App/app/src/test/java/com/samsung/matter/chipstdeviceapp/ExampleUnitTest.kt b/examples/st-device-app/android/App/app/src/test/java/com/samsung/matter/chipstdeviceapp/ExampleUnitTest.kt index 86fdb9e387fb7e..14085283253908 100644 --- a/examples/st-device-app/android/App/app/src/test/java/com/samsung/matter/chipstdeviceapp/ExampleUnitTest.kt +++ b/examples/st-device-app/android/App/app/src/test/java/com/samsung/matter/chipstdeviceapp/ExampleUnitTest.kt @@ -1,8 +1,7 @@ package com.samsung.matter.chipstdeviceapp -import org.junit.Test - import org.junit.Assert.* +import org.junit.Test /** * Example local unit test, which will execute on the development machine (host). @@ -10,8 +9,8 @@ import org.junit.Assert.* * See [testing documentation](http://d.android.com/tools/testing). */ class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Deps.kt b/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Deps.kt index 20847711e9f444..9613cd91977c7a 100644 --- a/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Deps.kt +++ b/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Deps.kt @@ -1,49 +1,49 @@ package com.samsung.buildsrc object Deps { - object AndroidX { - const val core = "androidx.core:core-ktx:1.8.0" - const val appcompat = "androidx.appcompat:appcompat:1.5.1" - const val fragment = "androidx.fragment:fragment-ktx:1.5.7" - - object Lifecycle { - private const val lifecycleVersion = "2.3.1" - const val viewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion" - const val livedata = "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion" - const val compiler = "androidx.lifecycle:lifecycle-compiler:$lifecycleVersion" - } + object AndroidX { + const val core = "androidx.core:core-ktx:1.8.0" + const val appcompat = "androidx.appcompat:appcompat:1.5.1" + const val fragment = "androidx.fragment:fragment-ktx:1.5.7" + + object Lifecycle { + private const val lifecycleVersion = "2.3.1" + const val viewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion" + const val livedata = "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion" + const val compiler = "androidx.lifecycle:lifecycle-compiler:$lifecycleVersion" } - - const val material = "com.google.android.material:material:1.7.0" - - object Kotlin { - const val coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0" - const val coroutinesAndroid = "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1" - const val reflect = "org.jetbrains.kotlin:kotlin-reflect:1.5.31" - const val serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.2" - } - - object Dagger { - private const val daggerVersion = "2.44.2" - const val hiltAndroid = "com.google.dagger:hilt-android:$daggerVersion" - const val hiltAndroidCompiler = "com.google.dagger:hilt-android-compiler:$daggerVersion" - } - - object Test { - const val junit = "junit:junit:4.13.2" - const val junitExt = "androidx.test.ext:junit:1.1.3" - const val espresso = "androidx.test.espresso:espresso-core:3.4.0" - } - - object Navigation { - private const val navigationVersion = "2.5.3" - const val fragment = "androidx.navigation:navigation-fragment-ktx:$navigationVersion" - const val ui = "androidx.navigation:navigation-ui-ktx:$navigationVersion" - } - - const val timber = "com.jakewharton.timber:timber:5.0.1" - const val inject = "javax.inject:javax.inject:1" - const val zxing = "com.google.zxing:core:3.4.0" - const val lottie = "com.airbnb.android:lottie:3.4.1" - const val gson = "com.google.code.gson:gson:2.8.5" + } + + const val material = "com.google.android.material:material:1.7.0" + + object Kotlin { + const val coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0" + const val coroutinesAndroid = "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1" + const val reflect = "org.jetbrains.kotlin:kotlin-reflect:1.5.31" + const val serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.2" + } + + object Dagger { + private const val daggerVersion = "2.44.2" + const val hiltAndroid = "com.google.dagger:hilt-android:$daggerVersion" + const val hiltAndroidCompiler = "com.google.dagger:hilt-android-compiler:$daggerVersion" + } + + object Test { + const val junit = "junit:junit:4.13.2" + const val junitExt = "androidx.test.ext:junit:1.1.3" + const val espresso = "androidx.test.espresso:espresso-core:3.4.0" + } + + object Navigation { + private const val navigationVersion = "2.5.3" + const val fragment = "androidx.navigation:navigation-fragment-ktx:$navigationVersion" + const val ui = "androidx.navigation:navigation-ui-ktx:$navigationVersion" + } + + const val timber = "com.jakewharton.timber:timber:5.0.1" + const val inject = "javax.inject:javax.inject:1" + const val zxing = "com.google.zxing:core:3.4.0" + const val lottie = "com.airbnb.android:lottie:3.4.1" + const val gson = "com.google.code.gson:gson:2.8.5" } diff --git a/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Versions.kt b/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Versions.kt index 26a8513b03f369..2e193790936bd5 100644 --- a/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Versions.kt +++ b/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Versions.kt @@ -1,8 +1,8 @@ package com.samsung.buildsrc object Versions { - const val compileSdkVersion = 33 - const val buildToolsVersion = "31.0.0" - const val minSdkVersion = 24 - const val targetSdkVersion = 33 -} \ No newline at end of file + const val compileSdkVersion = 33 + const val buildToolsVersion = "31.0.0" + const val minSdkVersion = 24 + const val targetSdkVersion = 33 +} diff --git a/examples/st-device-app/android/App/core/common/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/core/common/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleInstrumentedTest.kt index dca026f695bfab..a3f8a2a0a69722 100644 --- a/examples/st-device-app/android/App/core/common/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleInstrumentedTest.kt +++ b/examples/st-device-app/android/App/core/common/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleInstrumentedTest.kt @@ -13,10 +13,10 @@ import org.junit.runner.RunWith */ @RunWith(AndroidJUnit4::class) class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.core.common.test", appContext.packageName) - } -} \ No newline at end of file + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.core.common.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/DeepLink.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/DeepLink.kt index a7d8c1f301f8a0..2b4da93cec833f 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/DeepLink.kt +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/DeepLink.kt @@ -4,15 +4,19 @@ import androidx.core.net.toUri import androidx.navigation.NavDeepLinkRequest object DeepLink { - fun getDeepLinkRequestForQrcodeFragment(setting: String): NavDeepLinkRequest { - return NavDeepLinkRequest.Builder - .fromUri("android-app://com.samsung.matter.chipstdeviceapp.feature.qrcode/qrcodeFragment/${setting}".toUri()) - .build() - } + fun getDeepLinkRequestForQrcodeFragment(setting: String): NavDeepLinkRequest { + return NavDeepLinkRequest.Builder.fromUri( + "android-app://com.samsung.matter.chipstdeviceapp.feature.qrcode/qrcodeFragment/${setting}" + .toUri() + ) + .build() + } - fun getDeepLinkRequestForSetupFragment(setting: String): NavDeepLinkRequest { - return NavDeepLinkRequest.Builder - .fromUri("android-app://com.samsung.matter.chipstdeviceapp.feature.setup/setupFragment/${setting}".toUri()) - .build() - } -} \ No newline at end of file + fun getDeepLinkRequestForSetupFragment(setting: String): NavDeepLinkRequest { + return NavDeepLinkRequest.Builder.fromUri( + "android-app://com.samsung.matter.chipstdeviceapp.feature.setup/setupFragment/${setting}" + .toUri() + ) + .build() + } +} diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Device.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Device.kt index 48b71134dc8a6c..d7897ed62784dc 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Device.kt +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Device.kt @@ -6,38 +6,42 @@ import kotlinx.serialization.Serializable @Serializable sealed class Device( - val title: String, - val productId: Long, - @StringRes val deviceNameResId: Int, - @DrawableRes val deviceIconResId: Int, - val deviceTypeId: Long, - val discriminator: Int + val title: String, + val productId: Long, + @StringRes val deviceNameResId: Int, + @DrawableRes val deviceIconResId: Int, + val deviceTypeId: Long, + val discriminator: Int ) { - @Serializable - object OnOffSwitch : Device( - "onoffswitch", - 0x1001, - R.string.samsung_on_off_switch, - R.drawable.round_toggle_on_24, - 0x0103, - 3841 + @Serializable + object OnOffSwitch : + Device( + "onoffswitch", + 0x1001, + R.string.samsung_on_off_switch, + R.drawable.round_toggle_on_24, + 0x0103, + 3841 ) - @Serializable - object Unknown : Device( - "unknown", - 0xFFFF, - R.string.matter_device, - R.drawable.round_device_unknown_24, - 65535, - 3840 + @Serializable + object Unknown : + Device( + "unknown", + 0xFFFF, + R.string.matter_device, + R.drawable.round_device_unknown_24, + 65535, + 3840 ) - companion object { - fun map(title: String): Device { - return Device::class.sealedSubclasses.firstOrNull { - it.objectInstance?.title == title - }?.objectInstance ?: Unknown - } + companion object { + fun map(title: String): Device { + return Device::class + .sealedSubclasses + .firstOrNull { it.objectInstance?.title == title } + ?.objectInstance + ?: Unknown } + } } diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterConstants.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterConstants.kt index c00e47822309cb..d3b85c81bd94d3 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterConstants.kt +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterConstants.kt @@ -1,11 +1,11 @@ package com.samsung.matter.chipstdeviceapp.core.common object MatterConstants { - const val DEFAULT_VERSION = 0 - const val DEFAULT_VENDOR_ID = 0x10E1 - const val DEFAULT_PRODUCT_ID = 0x1001 - const val DEFAULT_COMMISSIONING_FLOW = 0 - const val DEFAULT_SETUP_PINCODE = 20202021L - const val DEFAULT_DISCRIMINATOR = 3840 - const val DEFAULT_DEVICE_NAME = "Matter Device" -} \ No newline at end of file + const val DEFAULT_VERSION = 0 + const val DEFAULT_VENDOR_ID = 0x10E1 + const val DEFAULT_PRODUCT_ID = 0x1001 + const val DEFAULT_COMMISSIONING_FLOW = 0 + const val DEFAULT_SETUP_PINCODE = 20202021L + const val DEFAULT_DISCRIMINATOR = 3840 + const val DEFAULT_DEVICE_NAME = "Matter Device" +} diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterSettings.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterSettings.kt index 9bda4c3facf885..fc1371c1636dcf 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterSettings.kt +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterSettings.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable @Serializable data class MatterSettings( - var device: Device = Device.Unknown, - var onboardingType: OnboardingType = OnboardingType.UNKNOWN, - var discriminator: Int = MatterConstants.DEFAULT_DISCRIMINATOR + var device: Device = Device.Unknown, + var onboardingType: OnboardingType = OnboardingType.UNKNOWN, + var discriminator: Int = MatterConstants.DEFAULT_DISCRIMINATOR ) diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/QrcodeUtil.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/QrcodeUtil.kt index 1969b8f9b5a520..82c6869a36ca0e 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/QrcodeUtil.kt +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/QrcodeUtil.kt @@ -7,23 +7,23 @@ import com.google.zxing.qrcode.QRCodeWriter object QrcodeUtil { - fun createQrCodeBitmap(contents: String, width: Int, height: Int): Bitmap? { - try { - val bitMatrix = QRCodeWriter().encode(contents, BarcodeFormat.QR_CODE, width, height) - val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) + fun createQrCodeBitmap(contents: String, width: Int, height: Int): Bitmap? { + try { + val bitMatrix = QRCodeWriter().encode(contents, BarcodeFormat.QR_CODE, width, height) + val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) - for (y in 0 until bitMatrix.height) { - for (x in 0 until bitMatrix.width) { - if (bitMatrix.get(x, y)) { - bitmap.setPixel(x, y, Color.BLACK) - } - } - } - - return bitmap - } catch (e: Exception) { - e.printStackTrace() - return null + for (y in 0 until bitMatrix.height) { + for (x in 0 until bitMatrix.width) { + if (bitMatrix.get(x, y)) { + bitmap.setPixel(x, y, Color.BLACK) + } } + } + + return bitmap + } catch (e: Exception) { + e.printStackTrace() + return null } -} \ No newline at end of file + } +} diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Result.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Result.kt index 9f80ec9d70ef64..ded10cab7a4196 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Result.kt +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Result.kt @@ -2,17 +2,19 @@ package com.samsung.matter.chipstdeviceapp.core.common sealed class Result { - data class Success(val data: T) : Result() - data class Error(val exception: Throwable) : Result() - object Loading : Result() + data class Success(val data: T) : Result() + + data class Error(val exception: Throwable) : Result() + + object Loading : Result() } val Result<*>.succeeded - get() = this is Result.Success && data != null + get() = this is Result.Success && data != null fun Result.successOr(fallback: T): T { - return (this as? Result.Success)?.data ?: fallback + return (this as? Result.Success)?.data ?: fallback } val Result.data: T? - get() = (this as? Result.Success)?.data \ No newline at end of file + get() = (this as? Result.Success)?.data diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesModule.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesModule.kt index 07518b68a36773..a6ac2ee76db81f 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesModule.kt +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesModule.kt @@ -4,30 +4,27 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers -import javax.inject.Singleton @InstallIn(SingletonComponent::class) @Module internal object CoroutinesModule { - @DefaultDispatcher - @Provides - @Singleton - fun provideDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default + @DefaultDispatcher + @Provides + @Singleton + fun provideDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default - @IoDispatcher - @Provides - @Singleton - fun provideIoDispatcher(): CoroutineDispatcher = Dispatchers.IO + @IoDispatcher @Provides @Singleton fun provideIoDispatcher(): CoroutineDispatcher = Dispatchers.IO - @MainDispatcher - @Provides - @Singleton - fun provideMainDispatcher(): CoroutineDispatcher = Dispatchers.Main + @MainDispatcher + @Provides + @Singleton + fun provideMainDispatcher(): CoroutineDispatcher = Dispatchers.Main - @MainImmediateDispatcher - @Provides - @Singleton - fun provideMainImmediateDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate -} \ No newline at end of file + @MainImmediateDispatcher + @Provides + @Singleton + fun provideMainImmediateDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate +} diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesQualifiers.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesQualifiers.kt index b2397fe436e4b5..b1baa62cd20b0b 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesQualifiers.kt +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesQualifiers.kt @@ -2,18 +2,10 @@ package com.samsung.matter.chipstdeviceapp.core.common.di import javax.inject.Qualifier -@Retention(AnnotationRetention.BINARY) -@Qualifier -annotation class DefaultDispatcher +@Retention(AnnotationRetention.BINARY) @Qualifier annotation class DefaultDispatcher -@Retention(AnnotationRetention.BINARY) -@Qualifier -annotation class IoDispatcher +@Retention(AnnotationRetention.BINARY) @Qualifier annotation class IoDispatcher -@Retention(AnnotationRetention.BINARY) -@Qualifier -annotation class MainDispatcher +@Retention(AnnotationRetention.BINARY) @Qualifier annotation class MainDispatcher -@Retention(AnnotationRetention.BINARY) -@Qualifier -annotation class MainImmediateDispatcher \ No newline at end of file +@Retention(AnnotationRetention.BINARY) @Qualifier annotation class MainImmediateDispatcher diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/ui/DisableAppBarLayoutBehavior.kt b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/ui/DisableAppBarLayoutBehavior.kt index cd9c99c80673b8..b302b0dd002d42 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/ui/DisableAppBarLayoutBehavior.kt +++ b/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/ui/DisableAppBarLayoutBehavior.kt @@ -1,6 +1,5 @@ package com.samsung.matter.chipstdeviceapp.core.common.ui - import android.content.Context import android.util.AttributeSet import android.view.MotionEvent @@ -8,26 +7,25 @@ import android.view.View import androidx.coordinatorlayout.widget.CoordinatorLayout import com.google.android.material.appbar.AppBarLayout -class DisableAppBarLayoutBehavior( - context: Context, attributeSet: AttributeSet -) : AppBarLayout.Behavior(context, attributeSet) { +class DisableAppBarLayoutBehavior(context: Context, attributeSet: AttributeSet) : + AppBarLayout.Behavior(context, attributeSet) { - override fun onStartNestedScroll( - parent: CoordinatorLayout, - child: AppBarLayout, - directTargetChild: View, - target: View, - nestedScrollAxes: Int, - type: Int - ): Boolean { - return false - } + override fun onStartNestedScroll( + parent: CoordinatorLayout, + child: AppBarLayout, + directTargetChild: View, + target: View, + nestedScrollAxes: Int, + type: Int + ): Boolean { + return false + } - override fun onTouchEvent( - parent: CoordinatorLayout, - child: AppBarLayout, - ev: MotionEvent - ): Boolean { - return false - } -} \ No newline at end of file + override fun onTouchEvent( + parent: CoordinatorLayout, + child: AppBarLayout, + ev: MotionEvent + ): Boolean { + return false + } +} diff --git a/examples/st-device-app/android/App/core/common/src/test/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleUnitTest.kt b/examples/st-device-app/android/App/core/common/src/test/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleUnitTest.kt index 20b54aa0c63c72..ae72dc6a3e6e01 100644 --- a/examples/st-device-app/android/App/core/common/src/test/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleUnitTest.kt +++ b/examples/st-device-app/android/App/core/common/src/test/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleUnitTest.kt @@ -1,8 +1,7 @@ package com.samsung.matter.chipstdeviceapp.core.common -import org.junit.Test - import org.junit.Assert.* +import org.junit.Test /** * Example local unit test, which will execute on the development machine (host). @@ -10,8 +9,8 @@ import org.junit.Assert.* * See [testing documentation](http://d.android.com/tools/testing). */ class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/core/data/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/core/data/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleInstrumentedTest.kt index 9b9203c728a691..4ec8e63e43ab2c 100644 --- a/examples/st-device-app/android/App/core/data/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleInstrumentedTest.kt +++ b/examples/st-device-app/android/App/core/data/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.samsung.matter.chipstdeviceapp.core.data -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * @@ -15,10 +13,10 @@ import org.junit.Assert.* */ @RunWith(AndroidJUnit4::class) class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.core.data.test", appContext.packageName) - } -} \ No newline at end of file + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.core.data.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/di/DataModule.kt b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/di/DataModule.kt index 6c582b829b3b4e..d1990b78336b75 100644 --- a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/di/DataModule.kt +++ b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/di/DataModule.kt @@ -10,13 +10,7 @@ import dagger.hilt.components.SingletonComponent @Module internal abstract class DataModule { - @Binds - abstract fun bindMatterRepository( - repository: MatterRepositoryImpl - ): MatterRepository + @Binds abstract fun bindMatterRepository(repository: MatterRepositoryImpl): MatterRepository - @Binds - abstract fun bindNetworkRepository( - repository: NetworkRepositoryImpl - ): NetworkRepository -} \ No newline at end of file + @Binds abstract fun bindNetworkRepository(repository: NetworkRepositoryImpl): NetworkRepository +} diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepository.kt b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepository.kt index bd85f638f7e934..6e88011ed8b7af 100644 --- a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepository.kt +++ b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepository.kt @@ -3,6 +3,7 @@ package com.samsung.matter.chipstdeviceapp.core.data.repository import com.samsung.matter.chipstdeviceapp.core.model.Payload interface MatterRepository { - fun getQrcodeString(payload: Payload): String - fun getManualPairingCodeString(payload: Payload): String -} \ No newline at end of file + fun getQrcodeString(payload: Payload): String + + fun getManualPairingCodeString(payload: Payload): String +} diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepositoryImpl.kt b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepositoryImpl.kt index 63afa343a743fe..29c1825dc09ec3 100644 --- a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepositoryImpl.kt +++ b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepositoryImpl.kt @@ -4,15 +4,14 @@ import com.samsung.matter.chipstdeviceapp.core.matter.MatterApi import com.samsung.matter.chipstdeviceapp.core.model.Payload import javax.inject.Inject -internal class MatterRepositoryImpl @Inject constructor( - private val matterApi: MatterApi -) : MatterRepository { +internal class MatterRepositoryImpl @Inject constructor(private val matterApi: MatterApi) : + MatterRepository { - override fun getQrcodeString(payload: Payload): String { - return matterApi.getQrcodeString(payload) - } + override fun getQrcodeString(payload: Payload): String { + return matterApi.getQrcodeString(payload) + } - override fun getManualPairingCodeString(payload: Payload): String { - return matterApi.getManualPairingCodeString(payload) - } + override fun getManualPairingCodeString(payload: Payload): String { + return matterApi.getManualPairingCodeString(payload) + } } diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepository.kt b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepository.kt index a8a5a18d0e8b8b..1035a9fd474cc8 100644 --- a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepository.kt +++ b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepository.kt @@ -1,5 +1,5 @@ package com.samsung.matter.chipstdeviceapp.core.data.repository interface NetworkRepository { - suspend fun getSSID(): String -} \ No newline at end of file + suspend fun getSSID(): String +} diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepositoryImpl.kt b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepositoryImpl.kt index dd98e9c2252571..3f38d7710127a4 100644 --- a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepositoryImpl.kt +++ b/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepositoryImpl.kt @@ -4,30 +4,31 @@ import android.content.Context import android.net.wifi.SupplicantState import android.net.wifi.WifiManager import dagger.hilt.android.qualifiers.ApplicationContext -import timber.log.Timber import javax.inject.Inject +import timber.log.Timber -internal class NetworkRepositoryImpl @Inject constructor( - @ApplicationContext private val context: Context -) : NetworkRepository { - - override suspend fun getSSID(): String { - Timber.d("Hit") - return try { - val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager? - wifiManager?.let { - val wifiInfo = wifiManager.connectionInfo - var ssid = "" - if (wifiInfo.supplicantState == SupplicantState.COMPLETED) { - Timber.d("ssid:${wifiInfo.ssid}") - ssid = wifiInfo.ssid.replace("\"", "") - } +internal class NetworkRepositoryImpl +@Inject +constructor(@ApplicationContext private val context: Context) : NetworkRepository { - ssid - } ?: "Unknown" - } catch (e: Exception) { - Timber.e(e, "Exception") - "Unknown" + override suspend fun getSSID(): String { + Timber.d("Hit") + return try { + val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager? + wifiManager?.let { + val wifiInfo = wifiManager.connectionInfo + var ssid = "" + if (wifiInfo.supplicantState == SupplicantState.COMPLETED) { + Timber.d("ssid:${wifiInfo.ssid}") + ssid = wifiInfo.ssid.replace("\"", "") } + + ssid + } + ?: "Unknown" + } catch (e: Exception) { + Timber.e(e, "Exception") + "Unknown" } -} \ No newline at end of file + } +} diff --git a/examples/st-device-app/android/App/core/data/src/test/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleUnitTest.kt b/examples/st-device-app/android/App/core/data/src/test/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleUnitTest.kt index 6804e8d4d8cdc9..17f5d89996f536 100644 --- a/examples/st-device-app/android/App/core/data/src/test/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleUnitTest.kt +++ b/examples/st-device-app/android/App/core/data/src/test/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleUnitTest.kt @@ -1,8 +1,7 @@ package com.samsung.matter.chipstdeviceapp.core.data -import org.junit.Test - import org.junit.Assert.* +import org.junit.Test /** * Example local unit test, which will execute on the development machine (host). @@ -10,8 +9,8 @@ import org.junit.Assert.* * See [testing documentation](http://d.android.com/tools/testing). */ class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/core/domain/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/core/domain/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleInstrumentedTest.kt index 1ddd78a49f5957..ccd4213230c502 100644 --- a/examples/st-device-app/android/App/core/domain/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleInstrumentedTest.kt +++ b/examples/st-device-app/android/App/core/domain/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.samsung.matter.chipstdeviceapp.core.domain -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * @@ -15,10 +13,10 @@ import org.junit.Assert.* */ @RunWith(AndroidJUnit4::class) class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.core.domain.test", appContext.packageName) - } -} \ No newline at end of file + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.core.domain.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/CoroutineUseCase.kt b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/CoroutineUseCase.kt index bb8dab46a416da..f7a476754a5d4a 100644 --- a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/CoroutineUseCase.kt +++ b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/CoroutineUseCase.kt @@ -6,18 +6,13 @@ import kotlinx.coroutines.withContext abstract class CoroutineUseCase(private val coroutineDispatcher: CoroutineDispatcher) { - suspend operator fun invoke(parameters: P): Result { - return try { - withContext(coroutineDispatcher) { - execute(parameters).let { - Result.Success(it) - } - } - } catch (e: Exception) { - Result.Error(e) - } + suspend operator fun invoke(parameters: P): Result { + return try { + withContext(coroutineDispatcher) { execute(parameters).let { Result.Success(it) } } + } catch (e: Exception) { + Result.Error(e) } + } - @Throws(RuntimeException::class) - protected abstract suspend fun execute(param: P): R -} \ No newline at end of file + @Throws(RuntimeException::class) protected abstract suspend fun execute(param: P): R +} diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/NonParamCoroutineUseCase.kt b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/NonParamCoroutineUseCase.kt index d196f3220d8364..19bbc11d023dd7 100644 --- a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/NonParamCoroutineUseCase.kt +++ b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/NonParamCoroutineUseCase.kt @@ -6,18 +6,13 @@ import kotlinx.coroutines.withContext abstract class NonParamCoroutineUseCase(private val coroutineDispatcher: CoroutineDispatcher) { - suspend operator fun invoke(): Result { - return try { - withContext(coroutineDispatcher) { - execute().let { - Result.Success(it) - } - } - } catch (e: Exception) { - Result.Error(e) - } + suspend operator fun invoke(): Result { + return try { + withContext(coroutineDispatcher) { execute().let { Result.Success(it) } } + } catch (e: Exception) { + Result.Error(e) } + } - @Throws(RuntimeException::class) - protected abstract suspend fun execute(): R -} \ No newline at end of file + @Throws(RuntimeException::class) protected abstract suspend fun execute(): R +} diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt index d4948748f5c262..fa70bcad79372c 100644 --- a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt +++ b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt @@ -4,15 +4,17 @@ import com.samsung.matter.chipstdeviceapp.core.common.di.IoDispatcher import com.samsung.matter.chipstdeviceapp.core.data.repository.MatterRepository import com.samsung.matter.chipstdeviceapp.core.domain.CoroutineUseCase import com.samsung.matter.chipstdeviceapp.core.model.Payload -import kotlinx.coroutines.CoroutineDispatcher import javax.inject.Inject +import kotlinx.coroutines.CoroutineDispatcher -class GetManualPairingCodeStringUseCase @Inject constructor( - private val matterRepository: MatterRepository, - @IoDispatcher dispatcher: CoroutineDispatcher +class GetManualPairingCodeStringUseCase +@Inject +constructor( + private val matterRepository: MatterRepository, + @IoDispatcher dispatcher: CoroutineDispatcher ) : CoroutineUseCase(dispatcher) { - override suspend fun execute(param: Payload): String { - return matterRepository.getManualPairingCodeString(param) - } -} \ No newline at end of file + override suspend fun execute(param: Payload): String { + return matterRepository.getManualPairingCodeString(param) + } +} diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetQrCodeStringUseCase.kt b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetQrCodeStringUseCase.kt index 57346ac0fbaa6f..2f57140572f600 100644 --- a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetQrCodeStringUseCase.kt +++ b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetQrCodeStringUseCase.kt @@ -4,15 +4,17 @@ import com.samsung.matter.chipstdeviceapp.core.common.di.IoDispatcher import com.samsung.matter.chipstdeviceapp.core.data.repository.MatterRepository import com.samsung.matter.chipstdeviceapp.core.domain.CoroutineUseCase import com.samsung.matter.chipstdeviceapp.core.model.Payload -import kotlinx.coroutines.CoroutineDispatcher import javax.inject.Inject +import kotlinx.coroutines.CoroutineDispatcher -class GetQrcodeStringUseCase @Inject constructor( - private val matterRepository: MatterRepository, - @IoDispatcher dispatcher: CoroutineDispatcher +class GetQrcodeStringUseCase +@Inject +constructor( + private val matterRepository: MatterRepository, + @IoDispatcher dispatcher: CoroutineDispatcher ) : CoroutineUseCase(dispatcher) { - override suspend fun execute(param: Payload): String { - return matterRepository.getQrcodeString(param) - } -} \ No newline at end of file + override suspend fun execute(param: Payload): String { + return matterRepository.getQrcodeString(param) + } +} diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/network/GetSSIDUseCase.kt b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/network/GetSSIDUseCase.kt index b6955286c9b85e..66d1a81712b10c 100644 --- a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/network/GetSSIDUseCase.kt +++ b/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/network/GetSSIDUseCase.kt @@ -3,15 +3,17 @@ package com.samsung.matter.chipstdeviceapp.core.domain.usecase.network import com.samsung.matter.chipstdeviceapp.core.common.di.IoDispatcher import com.samsung.matter.chipstdeviceapp.core.data.repository.NetworkRepository import com.samsung.matter.chipstdeviceapp.core.domain.NonParamCoroutineUseCase -import kotlinx.coroutines.CoroutineDispatcher import javax.inject.Inject +import kotlinx.coroutines.CoroutineDispatcher -class GetSSIDUseCase @Inject constructor( - private val networkRepository: NetworkRepository, - @IoDispatcher dispatcher: CoroutineDispatcher +class GetSSIDUseCase +@Inject +constructor( + private val networkRepository: NetworkRepository, + @IoDispatcher dispatcher: CoroutineDispatcher ) : NonParamCoroutineUseCase(dispatcher) { - override suspend fun execute(): String { - return networkRepository.getSSID() - } -} \ No newline at end of file + override suspend fun execute(): String { + return networkRepository.getSSID() + } +} diff --git a/examples/st-device-app/android/App/core/domain/src/test/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleUnitTest.kt b/examples/st-device-app/android/App/core/domain/src/test/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleUnitTest.kt index d96fee37920d7a..baad81b9e2cc63 100644 --- a/examples/st-device-app/android/App/core/domain/src/test/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleUnitTest.kt +++ b/examples/st-device-app/android/App/core/domain/src/test/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleUnitTest.kt @@ -1,8 +1,7 @@ package com.samsung.matter.chipstdeviceapp.core.domain -import org.junit.Test - import org.junit.Assert.* +import org.junit.Test /** * Example local unit test, which will execute on the development machine (host). @@ -10,8 +9,8 @@ import org.junit.Assert.* * See [testing documentation](http://d.android.com/tools/testing). */ class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/core/matter/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/core/matter/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleInstrumentedTest.kt index bbe718639154ef..843cd8d134b8d4 100644 --- a/examples/st-device-app/android/App/core/matter/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleInstrumentedTest.kt +++ b/examples/st-device-app/android/App/core/matter/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.samsung.matter.chipstdeviceapp.core.matter -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * @@ -15,10 +13,10 @@ import org.junit.Assert.* */ @RunWith(AndroidJUnit4::class) class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.core.matter.test", appContext.packageName) - } -} \ No newline at end of file + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.core.matter.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/MatterApi.kt b/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/MatterApi.kt index f3f197893959dc..17db4fb6d96585 100644 --- a/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/MatterApi.kt +++ b/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/MatterApi.kt @@ -4,37 +4,37 @@ import chip.onboardingpayload.OnboardingPayloadException import chip.onboardingpayload.OnboardingPayloadParser import com.samsung.matter.chipstdeviceapp.core.matter.model.asSetupPayload import com.samsung.matter.chipstdeviceapp.core.model.Payload -import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton +import timber.log.Timber @Singleton class MatterApi @Inject constructor() { - fun getQrcodeString(payload: Payload): String { - val onboardingPayloadParser = OnboardingPayloadParser() - var qrcode = "" - try { - qrcode = onboardingPayloadParser.getQrCodeFromPayload(payload.asSetupPayload()) - } catch (e: OnboardingPayloadException) { - e.printStackTrace() - } - - Timber.d("qrcode:$qrcode") - return qrcode + fun getQrcodeString(payload: Payload): String { + val onboardingPayloadParser = OnboardingPayloadParser() + var qrcode = "" + try { + qrcode = onboardingPayloadParser.getQrCodeFromPayload(payload.asSetupPayload()) + } catch (e: OnboardingPayloadException) { + e.printStackTrace() } - fun getManualPairingCodeString(payload: Payload): String { - val onboardingPayloadParser = OnboardingPayloadParser() - var manualPairingCode = "" - try { - manualPairingCode = - onboardingPayloadParser.getManualPairingCodeFromPayload(payload.asSetupPayload()) - } catch (e: OnboardingPayloadException) { - e.printStackTrace() - } + Timber.d("qrcode:$qrcode") + return qrcode + } - Timber.d("manualPairingCode:$manualPairingCode") - return manualPairingCode + fun getManualPairingCodeString(payload: Payload): String { + val onboardingPayloadParser = OnboardingPayloadParser() + var manualPairingCode = "" + try { + manualPairingCode = + onboardingPayloadParser.getManualPairingCodeFromPayload(payload.asSetupPayload()) + } catch (e: OnboardingPayloadException) { + e.printStackTrace() } -} \ No newline at end of file + + Timber.d("manualPairingCode:$manualPairingCode") + return manualPairingCode + } +} diff --git a/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/model/Payload.kt b/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/model/Payload.kt index 0f0a9ad102013f..a3250c80898572 100644 --- a/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/model/Payload.kt +++ b/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/model/Payload.kt @@ -8,26 +8,26 @@ import com.samsung.matter.chipstdeviceapp.core.model.Payload import timber.log.Timber fun Payload.asSetupPayload(): OnboardingPayload { - val discoveryCapabilities = HashSet() - when (this.onboardingType) { - OnboardingType.WIFI -> discoveryCapabilities.add(DiscoveryCapability.ON_NETWORK) - OnboardingType.BLE -> discoveryCapabilities.add(DiscoveryCapability.BLE) - OnboardingType.WIFI_BLE -> { - discoveryCapabilities.add(DiscoveryCapability.ON_NETWORK) - discoveryCapabilities.add(DiscoveryCapability.BLE) - } - else -> { - Timber.e("Unknown Type") - } + val discoveryCapabilities = HashSet() + when (this.onboardingType) { + OnboardingType.WIFI -> discoveryCapabilities.add(DiscoveryCapability.ON_NETWORK) + OnboardingType.BLE -> discoveryCapabilities.add(DiscoveryCapability.BLE) + OnboardingType.WIFI_BLE -> { + discoveryCapabilities.add(DiscoveryCapability.ON_NETWORK) + discoveryCapabilities.add(DiscoveryCapability.BLE) } + else -> { + Timber.e("Unknown Type") + } + } - return OnboardingPayload( - MatterConstants.DEFAULT_VERSION, - MatterConstants.DEFAULT_VENDOR_ID, - productId, - MatterConstants.DEFAULT_COMMISSIONING_FLOW, - discoveryCapabilities, - discriminator, - MatterConstants.DEFAULT_SETUP_PINCODE - ) -} \ No newline at end of file + return OnboardingPayload( + MatterConstants.DEFAULT_VERSION, + MatterConstants.DEFAULT_VENDOR_ID, + productId, + MatterConstants.DEFAULT_COMMISSIONING_FLOW, + discoveryCapabilities, + discriminator, + MatterConstants.DEFAULT_SETUP_PINCODE + ) +} diff --git a/examples/st-device-app/android/App/core/matter/src/test/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleUnitTest.kt b/examples/st-device-app/android/App/core/matter/src/test/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleUnitTest.kt index 75a5dab709b73f..e8630a44c49a93 100644 --- a/examples/st-device-app/android/App/core/matter/src/test/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleUnitTest.kt +++ b/examples/st-device-app/android/App/core/matter/src/test/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleUnitTest.kt @@ -1,8 +1,7 @@ package com.samsung.matter.chipstdeviceapp.core.matter -import org.junit.Test - import org.junit.Assert.* +import org.junit.Test /** * Example local unit test, which will execute on the development machine (host). @@ -10,8 +9,8 @@ import org.junit.Assert.* * See [testing documentation](http://d.android.com/tools/testing). */ class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/core/model/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/core/model/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleInstrumentedTest.kt index 6cc5f2bda0d7ec..d1aae5ddc6f8be 100644 --- a/examples/st-device-app/android/App/core/model/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleInstrumentedTest.kt +++ b/examples/st-device-app/android/App/core/model/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.samsung.matter.chipstdeviceapp.core.model -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * @@ -15,10 +13,10 @@ import org.junit.Assert.* */ @RunWith(AndroidJUnit4::class) class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.core.model.test", appContext.packageName) - } -} \ No newline at end of file + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.core.model.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/OnobardingType.kt b/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/OnobardingType.kt index acc6f18cd1af3f..6da33d51698da0 100644 --- a/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/OnobardingType.kt +++ b/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/OnobardingType.kt @@ -1,12 +1,16 @@ package com.samsung.matter.chipstdeviceapp.core.model enum class OnboardingType { - WIFI, BLE, WIFI_BLE, UNKNOWN + WIFI, + BLE, + WIFI_BLE, + UNKNOWN } -fun Int.asOnboardingType() = when (this) { +fun Int.asOnboardingType() = + when (this) { 0 -> OnboardingType.WIFI 1 -> OnboardingType.BLE 2 -> OnboardingType.WIFI_BLE else -> OnboardingType.UNKNOWN -} + } diff --git a/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/Payload.kt b/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/Payload.kt index c7e6697667b2b1..de84c9d14e7a4d 100644 --- a/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/Payload.kt +++ b/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/Payload.kt @@ -1,7 +1,3 @@ package com.samsung.matter.chipstdeviceapp.core.model -data class Payload( - val productId: Int, - val onboardingType: OnboardingType, - val discriminator: Int -) \ No newline at end of file +data class Payload(val productId: Int, val onboardingType: OnboardingType, val discriminator: Int) diff --git a/examples/st-device-app/android/App/core/model/src/test/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleUnitTest.kt b/examples/st-device-app/android/App/core/model/src/test/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleUnitTest.kt index f954f4cf614caa..be593fb882e063 100644 --- a/examples/st-device-app/android/App/core/model/src/test/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleUnitTest.kt +++ b/examples/st-device-app/android/App/core/model/src/test/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleUnitTest.kt @@ -1,8 +1,7 @@ package com.samsung.matter.chipstdeviceapp.core.model -import org.junit.Test - import org.junit.Assert.* +import org.junit.Test /** * Example local unit test, which will execute on the development machine (host). @@ -10,8 +9,8 @@ import org.junit.Assert.* * See [testing documentation](http://d.android.com/tools/testing). */ class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/feature/main/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/feature/main/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleInstrumentedTest.kt index 357b0c54b595c0..8c0acce971f61a 100644 --- a/examples/st-device-app/android/App/feature/main/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleInstrumentedTest.kt +++ b/examples/st-device-app/android/App/feature/main/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.samsung.matter.chipstdeviceapp.feature.main -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * @@ -15,10 +13,10 @@ import org.junit.Assert.* */ @RunWith(AndroidJUnit4::class) class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.feature.main.test", appContext.packageName) - } -} \ No newline at end of file + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.feature.main.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/model/Menu.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/model/Menu.kt index 71e82d38dd22ba..260127778c04e8 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/model/Menu.kt +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/model/Menu.kt @@ -6,14 +6,14 @@ import com.samsung.matter.chipstdeviceapp.core.common.Device import com.samsung.matter.chipstdeviceapp.feature.main.R enum class Menu( - @DrawableRes val iconResId: Int, - @StringRes val titleResId: Int, - val isDim: Boolean = false, - val device: Device = Device.Unknown + @DrawableRes val iconResId: Int, + @StringRes val titleResId: Int, + val isDim: Boolean = false, + val device: Device = Device.Unknown ) { - ON_OFF_SWITCH( - R.drawable.round_toggle_on_24, - R.string.samsung_on_off_switch, - device = Device.OnOffSwitch - ) + ON_OFF_SWITCH( + R.drawable.round_toggle_on_24, + R.string.samsung_on_off_switch, + device = Device.OnOffSwitch + ) } diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/MainFragment.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/MainFragment.kt index efcebc086d236d..856006b919ccff 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/MainFragment.kt +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/MainFragment.kt @@ -19,108 +19,107 @@ import com.samsung.matter.chipstdeviceapp.feature.main.model.Menu import com.samsung.matter.chipstdeviceapp.feature.main.ui.adapter.MenuAdapter import com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview.VerticalSpaceItemDecoration import dagger.hilt.android.AndroidEntryPoint +import kotlin.math.abs import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import timber.log.Timber -import kotlin.math.abs @AndroidEntryPoint class MainFragment : Fragment() { - private lateinit var binding: FragmentMainBinding - private lateinit var onBackPressedCallback: OnBackPressedCallback - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - Timber.d("Hit") - binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false) - binding.lifecycleOwner = viewLifecycleOwner - - return binding.root + private lateinit var binding: FragmentMainBinding + private lateinit var onBackPressedCallback: OnBackPressedCallback + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + Timber.d("Hit") + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false) + binding.lifecycleOwner = viewLifecycleOwner + + return binding.root + } + + @OptIn(ExperimentalSerializationApi::class) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + Timber.d("Hit") + super.onViewCreated(view, savedInstanceState) + + (activity as AppCompatActivity).setSupportActionBar(binding.toolbar) + (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) + + binding.appBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset -> + var ratio = 0F + if (abs(verticalOffset) != 0) { + ratio = abs(verticalOffset).toFloat() / appBarLayout.totalScrollRange.toFloat() + } + + binding.collapseTitle.alpha = 1f - ratio * 2f + 0.1f + binding.toolbarTitle.alpha = (ratio - 0.5f) * 2f + 0.1f } - @OptIn(ExperimentalSerializationApi::class) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - Timber.d("Hit") - super.onViewCreated(view, savedInstanceState) - - (activity as AppCompatActivity).setSupportActionBar(binding.toolbar) - (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) - - binding.appBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset -> - var ratio = 0F - if (abs(verticalOffset) != 0) { - ratio = abs(verticalOffset).toFloat() / appBarLayout.totalScrollRange.toFloat() + val itemList = arrayListOf(Menu.ON_OFF_SWITCH) + + val menuAdapter = + MenuAdapter( + itemList, + object : MenuAdapter.ItemHandler { + override fun onClick(item: Menu) { + val matterSettings = MatterSettings(device = item.device) + val jsonSettings = Json.encodeToString(matterSettings) + try { + findNavController() + .navigate(DeepLink.getDeepLinkRequestForSetupFragment(jsonSettings)) + } catch (e: Exception) { + Timber.e(e, "navigate failure") } - - binding.collapseTitle.alpha = 1f - ratio * 2f + 0.1f - binding.toolbarTitle.alpha = (ratio - 0.5f) * 2f + 0.1f + } } + ) - val itemList = arrayListOf(Menu.ON_OFF_SWITCH) - - val menuAdapter = MenuAdapter(itemList, object : MenuAdapter.ItemHandler { - override fun onClick(item: Menu) { - val matterSettings = MatterSettings(device = item.device) - val jsonSettings = Json.encodeToString(matterSettings) - try { - findNavController().navigate( - DeepLink.getDeepLinkRequestForSetupFragment(jsonSettings) - ) - } catch (e: Exception) { - Timber.e(e, "navigate failure") - } - } - }) - - val sideSpace = resources.getDimension(R.dimen.menu_item_side_space).toInt() - val bottomSpace = resources.getDimension(R.dimen.menu_item_bottom_space).toInt() - - binding.recyclerView.apply { - layoutManager = LinearLayoutManager(requireContext()) - if (itemDecorationCount == 0) { - addItemDecoration( - VerticalSpaceItemDecoration( - sideSpace, - bottomSpace - ) - ) - } - adapter = menuAdapter - } - } + val sideSpace = resources.getDimension(R.dimen.menu_item_side_space).toInt() + val bottomSpace = resources.getDimension(R.dimen.menu_item_bottom_space).toInt() - override fun onResume() { - super.onResume() - Timber.d("onResume()") + binding.recyclerView.apply { + layoutManager = LinearLayoutManager(requireContext()) + if (itemDecorationCount == 0) { + addItemDecoration(VerticalSpaceItemDecoration(sideSpace, bottomSpace)) + } + adapter = menuAdapter } - - override fun onAttach(context: Context) { - Timber.d("Hit") - super.onAttach(context) - - onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - Timber.d("handleOnBackPressed()") - requireActivity().finishAffinity() - } + } + + override fun onResume() { + super.onResume() + Timber.d("onResume()") + } + + override fun onAttach(context: Context) { + Timber.d("Hit") + super.onAttach(context) + + onBackPressedCallback = + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + Timber.d("handleOnBackPressed()") + requireActivity().finishAffinity() } + } - requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback) - } + requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } - override fun onDetach() { - super.onDetach() - Timber.d("onDetach()") - onBackPressedCallback.remove() - } + override fun onDetach() { + super.onDetach() + Timber.d("onDetach()") + onBackPressedCallback.remove() + } - override fun onDestroy() { - super.onDestroy() - Timber.d("onDestroy()") - } + override fun onDestroy() { + super.onDestroy() + Timber.d("onDestroy()") + } } diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/MenuAdapter.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/MenuAdapter.kt index 9b7c147fa347ad..5581cd036fe83d 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/MenuAdapter.kt +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/MenuAdapter.kt @@ -7,29 +7,28 @@ import com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview.DataBindi import com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview.ItemDiffCallback import com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview.ListBindingAdapter +internal class MenuAdapter(menus: List, private val itemHandler: ItemHandler) : + ListBindingAdapter( + ItemDiffCallback( + onItemsTheSame = { old, new -> old.titleResId == new.titleResId }, + onContentsTheSame = { old, new -> old == new } + ) + ) { -internal class MenuAdapter( - menus: List, - private val itemHandler: ItemHandler -) : ListBindingAdapter(ItemDiffCallback( - onItemsTheSame = { old, new -> old.titleResId == new.titleResId }, - onContentsTheSame = { old, new -> old == new } -)) { + init { + submitList(menus) + } - init { - submitList(menus) - } + override fun getItemViewType(position: Int): Int { + return R.layout.item_menu + } - override fun getItemViewType(position: Int): Int { - return R.layout.item_menu - } + override fun viewBindViewHolder(holder: DataBindingViewHolder, position: Int) { + super.viewBindViewHolder(holder, position) + holder.binding.setVariable(BR.itemHandler, itemHandler) + } - override fun viewBindViewHolder(holder: DataBindingViewHolder, position: Int) { - super.viewBindViewHolder(holder, position) - holder.binding.setVariable(BR.itemHandler, itemHandler) - } - - interface ItemHandler { - fun onClick(item: Menu) - } + interface ItemHandler { + fun onClick(item: Menu) + } } diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/ViewBindingAdapter.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/ViewBindingAdapter.kt index 7ea32ece9462ae..89eb93936eafc9 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/ViewBindingAdapter.kt +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/ViewBindingAdapter.kt @@ -6,5 +6,5 @@ import androidx.databinding.BindingAdapter @BindingAdapter("setSrc") fun AppCompatImageView.bindSetSrc(@DrawableRes imgResId: Int) { - this.setImageResource(imgResId) + this.setImageResource(imgResId) } diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/DataBindingViewHolder.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/DataBindingViewHolder.kt index b86afdc16c3970..1cc569ccc7ff7e 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/DataBindingViewHolder.kt +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/DataBindingViewHolder.kt @@ -4,12 +4,11 @@ import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.RecyclerView import com.samsung.matter.chipstdeviceapp.feature.main.BR -class DataBindingViewHolder( - val binding: ViewDataBinding -) : RecyclerView.ViewHolder(binding.root) { +class DataBindingViewHolder(val binding: ViewDataBinding) : + RecyclerView.ViewHolder(binding.root) { - fun bind(item: T) { - binding.setVariable(BR.item, item) - binding.executePendingBindings() - } -} \ No newline at end of file + fun bind(item: T) { + binding.setVariable(BR.item, item) + binding.executePendingBindings() + } +} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ItemDiffCallback.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ItemDiffCallback.kt index ff9cd039470e37..af7964905b3334 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ItemDiffCallback.kt +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ItemDiffCallback.kt @@ -3,12 +3,12 @@ package com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview import androidx.recyclerview.widget.DiffUtil class ItemDiffCallback( - val onItemsTheSame: (T, T) -> Boolean, - val onContentsTheSame: (T, T) -> Boolean + val onItemsTheSame: (T, T) -> Boolean, + val onContentsTheSame: (T, T) -> Boolean ) : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: T, newItem: T): Boolean = onItemsTheSame(oldItem, newItem) + override fun areItemsTheSame(oldItem: T, newItem: T): Boolean = onItemsTheSame(oldItem, newItem) - override fun areContentsTheSame(oldItem: T, newItem: T): Boolean = - onContentsTheSame(oldItem, newItem) -} \ No newline at end of file + override fun areContentsTheSame(oldItem: T, newItem: T): Boolean = + onContentsTheSame(oldItem, newItem) +} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ListBindingAdapter.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ListBindingAdapter.kt index 35c53eaa133e30..94cb5d6abbe92c 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ListBindingAdapter.kt +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ListBindingAdapter.kt @@ -8,19 +8,18 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter abstract class ListBindingAdapter(diffCallback: DiffUtil.ItemCallback) : - ListAdapter>(diffCallback) { + ListAdapter>(diffCallback) { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataBindingViewHolder { - val layoutInflater = LayoutInflater.from(parent.context) - val binding = - DataBindingUtil.inflate(layoutInflater, viewType, parent, false) - return DataBindingViewHolder(binding) - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataBindingViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = DataBindingUtil.inflate(layoutInflater, viewType, parent, false) + return DataBindingViewHolder(binding) + } - override fun onBindViewHolder(holder: DataBindingViewHolder, position: Int) { - viewBindViewHolder(holder, position) - holder.bind(getItem(position)) - } + override fun onBindViewHolder(holder: DataBindingViewHolder, position: Int) { + viewBindViewHolder(holder, position) + holder.bind(getItem(position)) + } - protected open fun viewBindViewHolder(holder: DataBindingViewHolder, position: Int) {} -} \ No newline at end of file + protected open fun viewBindViewHolder(holder: DataBindingViewHolder, position: Int) {} +} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/VerticalSpaceItemDecoration.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/VerticalSpaceItemDecoration.kt index 387298e91157e2..67b6be56b7b2e9 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/VerticalSpaceItemDecoration.kt +++ b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/VerticalSpaceItemDecoration.kt @@ -4,24 +4,22 @@ import android.graphics.Rect import android.view.View import androidx.recyclerview.widget.RecyclerView -class VerticalSpaceItemDecoration( - private val sideSpace: Int, - private val bottomSpace: Int -) : RecyclerView.ItemDecoration() { +class VerticalSpaceItemDecoration(private val sideSpace: Int, private val bottomSpace: Int) : + RecyclerView.ItemDecoration() { - override fun getItemOffsets( - outRect: Rect, - view: View, - parent: RecyclerView, - state: RecyclerView.State - ) { - parent.adapter?.let { adapter -> - if (parent.getChildAdapterPosition(view) != adapter.itemCount - 1) { - outRect.bottom = bottomSpace - } + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + parent.adapter?.let { adapter -> + if (parent.getChildAdapterPosition(view) != adapter.itemCount - 1) { + outRect.bottom = bottomSpace + } - outRect.left = sideSpace - outRect.right = sideSpace - } + outRect.left = sideSpace + outRect.right = sideSpace } -} \ No newline at end of file + } +} diff --git a/examples/st-device-app/android/App/feature/main/src/test/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleUnitTest.kt b/examples/st-device-app/android/App/feature/main/src/test/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleUnitTest.kt index 616d34751a2b19..2f5c36ce14f472 100644 --- a/examples/st-device-app/android/App/feature/main/src/test/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleUnitTest.kt +++ b/examples/st-device-app/android/App/feature/main/src/test/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleUnitTest.kt @@ -1,8 +1,7 @@ package com.samsung.matter.chipstdeviceapp.feature.main -import org.junit.Test - import org.junit.Assert.* +import org.junit.Test /** * Example local unit test, which will execute on the development machine (host). @@ -10,8 +9,8 @@ import org.junit.Assert.* * See [testing documentation](http://d.android.com/tools/testing). */ class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/feature/qrcode/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/feature/qrcode/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleInstrumentedTest.kt index 7434ac380ca3f3..8881d4688b942b 100644 --- a/examples/st-device-app/android/App/feature/qrcode/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleInstrumentedTest.kt +++ b/examples/st-device-app/android/App/feature/qrcode/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.samsung.matter.chipstdeviceapp.feature.qrcode -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * @@ -15,13 +13,10 @@ import org.junit.Assert.* */ @RunWith(AndroidJUnit4::class) class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals( - "com.samsung.matter.chipstdeviceapp.feature.qrcode.test", - appContext.packageName - ) - } -} \ No newline at end of file + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.feature.qrcode.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt b/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt index f63ca93421f3e0..b04077a905f451 100644 --- a/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt +++ b/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt @@ -18,142 +18,141 @@ import com.samsung.matter.chipstdeviceapp.core.common.MatterSettings import com.samsung.matter.chipstdeviceapp.core.common.QrcodeUtil import com.samsung.matter.chipstdeviceapp.feature.qrcode.databinding.FragmentQrcodeBinding import dagger.hilt.android.AndroidEntryPoint +import kotlin.math.abs import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import timber.log.Timber -import kotlin.math.abs @AndroidEntryPoint class QrcodeFragment : Fragment() { - private lateinit var binding: FragmentQrcodeBinding - private val viewModel by viewModels() + private lateinit var binding: FragmentQrcodeBinding + private val viewModel by viewModels() - private lateinit var onBackPressedCallback: OnBackPressedCallback + private lateinit var onBackPressedCallback: OnBackPressedCallback - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - Timber.d("Hit") - binding = DataBindingUtil.inflate(inflater, R.layout.fragment_qrcode, container, false) - binding.lifecycleOwner = viewLifecycleOwner - binding.viewModel = viewModel + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + Timber.d("Hit") + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_qrcode, container, false) + binding.lifecycleOwner = viewLifecycleOwner + binding.viewModel = viewModel - return binding.root - } + return binding.root + } - @OptIn(ExperimentalSerializationApi::class) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - Timber.d("Hit") - super.onViewCreated(view, savedInstanceState) + @OptIn(ExperimentalSerializationApi::class) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + Timber.d("Hit") + super.onViewCreated(view, savedInstanceState) - (activity as AppCompatActivity).setSupportActionBar(binding.toolbar) - (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) + (activity as AppCompatActivity).setSupportActionBar(binding.toolbar) + (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) - binding.appBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset -> - var ratio = 0F - if (abs(verticalOffset) != 0) { - ratio = abs(verticalOffset).toFloat() / appBarLayout.totalScrollRange.toFloat() - } - - binding.collapseTitle.alpha = 1f - ratio * 2f + 0.1f - binding.toolbarTitle.alpha = (ratio - 0.5f) * 2f + 0.1f - } + binding.appBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset -> + var ratio = 0F + if (abs(verticalOffset) != 0) { + ratio = abs(verticalOffset).toFloat() / appBarLayout.totalScrollRange.toFloat() + } - val args: QrcodeFragmentArgs by navArgs() - val matterSettings = Json.decodeFromString(args.setting) - - viewModel.uiState.observe(viewLifecycleOwner) { - when (it) { - QrcodeUiState.Loading -> { - binding.progressBar.visibility = View.VISIBLE - } - is QrcodeUiState.Qrcode -> { - binding.progressBar.visibility = View.GONE - - binding.qrTypeImage.setImageResource(matterSettings.device.deviceIconResId) - binding.qrTypeTitle.text = getString(matterSettings.device.deviceNameResId) - - val qrCodeBitmap: Bitmap? = - QrcodeUtil.createQrCodeBitmap(it.qrCode, QR_WIDTH, QR_HEIGHT) - binding.qrImage.setImageBitmap(qrCodeBitmap) - - binding.qrText.text = getString(R.string.qrcode_qr_text, it.qrCode) - binding.manualCodeText.text = - getString(R.string.qrcode_manual_code_text, it.manualPairingCode) - binding.versionText.text = - getString( - R.string.qrcode_version_text, - MatterConstants.DEFAULT_VERSION.toString() - ) - binding.vendorIdText.text = getString( - R.string.qrcode_vendor_id_text, - MatterConstants.DEFAULT_VENDOR_ID.toString(), - MatterConstants.DEFAULT_VENDOR_ID - ) - binding.productIdText.text = getString( - R.string.qrcode_product_id_text, - matterSettings.device.productId.toString(), - matterSettings.device.productId - ) - binding.commissioningFlowText.text = getString( - R.string.qrcode_commissioning_flow_text, - MatterConstants.DEFAULT_COMMISSIONING_FLOW.toString() - ) - binding.onboardingTypeText.text = - getString( - R.string.qrcode_onboarding_type_text, - matterSettings.onboardingType - ) - binding.setupPinCodeText.text = getString( - R.string.qrcode_setup_pin_code_text, - MatterConstants.DEFAULT_SETUP_PINCODE.toString() - ) - binding.discriminatorText.text = getString( - R.string.qrcode_discriminator_text, - matterSettings.discriminator.toString(), - matterSettings.discriminator - ) - } - } - } - } - - override fun onResume() { - Timber.d("Hit") - super.onResume() + binding.collapseTitle.alpha = 1f - ratio * 2f + 0.1f + binding.toolbarTitle.alpha = (ratio - 0.5f) * 2f + 0.1f } - override fun onAttach(context: Context) { - Timber.d("Hit") - super.onAttach(context) + val args: QrcodeFragmentArgs by navArgs() + val matterSettings = Json.decodeFromString(args.setting) - onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - Timber.d("handleOnBackPressed()") - findNavController().popBackStack() - } + viewModel.uiState.observe(viewLifecycleOwner) { + when (it) { + QrcodeUiState.Loading -> { + binding.progressBar.visibility = View.VISIBLE } - - requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback) - } - - override fun onDetach() { - Timber.d("Hit") - super.onDetach() - onBackPressedCallback.remove() - } - - override fun onDestroy() { - Timber.d("Hit") - super.onDestroy() - } - - companion object { - private const val QR_WIDTH = 450 - private const val QR_HEIGHT = 450 + is QrcodeUiState.Qrcode -> { + binding.progressBar.visibility = View.GONE + + binding.qrTypeImage.setImageResource(matterSettings.device.deviceIconResId) + binding.qrTypeTitle.text = getString(matterSettings.device.deviceNameResId) + + val qrCodeBitmap: Bitmap? = QrcodeUtil.createQrCodeBitmap(it.qrCode, QR_WIDTH, QR_HEIGHT) + binding.qrImage.setImageBitmap(qrCodeBitmap) + + binding.qrText.text = getString(R.string.qrcode_qr_text, it.qrCode) + binding.manualCodeText.text = + getString(R.string.qrcode_manual_code_text, it.manualPairingCode) + binding.versionText.text = + getString(R.string.qrcode_version_text, MatterConstants.DEFAULT_VERSION.toString()) + binding.vendorIdText.text = + getString( + R.string.qrcode_vendor_id_text, + MatterConstants.DEFAULT_VENDOR_ID.toString(), + MatterConstants.DEFAULT_VENDOR_ID + ) + binding.productIdText.text = + getString( + R.string.qrcode_product_id_text, + matterSettings.device.productId.toString(), + matterSettings.device.productId + ) + binding.commissioningFlowText.text = + getString( + R.string.qrcode_commissioning_flow_text, + MatterConstants.DEFAULT_COMMISSIONING_FLOW.toString() + ) + binding.onboardingTypeText.text = + getString(R.string.qrcode_onboarding_type_text, matterSettings.onboardingType) + binding.setupPinCodeText.text = + getString( + R.string.qrcode_setup_pin_code_text, + MatterConstants.DEFAULT_SETUP_PINCODE.toString() + ) + binding.discriminatorText.text = + getString( + R.string.qrcode_discriminator_text, + matterSettings.discriminator.toString(), + matterSettings.discriminator + ) + } + } } -} \ No newline at end of file + } + + override fun onResume() { + Timber.d("Hit") + super.onResume() + } + + override fun onAttach(context: Context) { + Timber.d("Hit") + super.onAttach(context) + + onBackPressedCallback = + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + Timber.d("handleOnBackPressed()") + findNavController().popBackStack() + } + } + + requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } + + override fun onDetach() { + Timber.d("Hit") + super.onDetach() + onBackPressedCallback.remove() + } + + override fun onDestroy() { + Timber.d("Hit") + super.onDestroy() + } + + companion object { + private const val QR_WIDTH = 450 + private const val QR_HEIGHT = 450 + } +} diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeViewModel.kt b/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeViewModel.kt index 8bbc12f6ea56d5..3ae64cfa400df9 100644 --- a/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeViewModel.kt +++ b/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeViewModel.kt @@ -7,55 +7,60 @@ import com.samsung.matter.chipstdeviceapp.core.domain.usecase.matter.GetManualPa import com.samsung.matter.chipstdeviceapp.core.domain.usecase.matter.GetQrcodeStringUseCase import com.samsung.matter.chipstdeviceapp.core.model.Payload import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import timber.log.Timber -import javax.inject.Inject @OptIn(ExperimentalSerializationApi::class) @HiltViewModel -class QrcodeViewModel @Inject constructor( - private val getQrcodeStringUseCase: GetQrcodeStringUseCase, - private val getManualPairingCodeStringUseCase: GetManualPairingCodeStringUseCase, - savedStateHandle: SavedStateHandle +class QrcodeViewModel +@Inject +constructor( + private val getQrcodeStringUseCase: GetQrcodeStringUseCase, + private val getManualPairingCodeStringUseCase: GetManualPairingCodeStringUseCase, + savedStateHandle: SavedStateHandle ) : ViewModel() { - private val _uiState = MutableLiveData(QrcodeUiState.Loading) - val uiState: LiveData get() = _uiState + private val _uiState = MutableLiveData(QrcodeUiState.Loading) + val uiState: LiveData + get() = _uiState - init { - viewModelScope.launch { - val jsonSettings = savedStateHandle.get("setting") - jsonSettings?.let { - val matterSettings = Json.decodeFromString(it) + init { + viewModelScope.launch { + val jsonSettings = savedStateHandle.get("setting") + jsonSettings?.let { + val matterSettings = Json.decodeFromString(it) - //TODO : start service - delay(500) + // TODO : start service + delay(500) - val payload = Payload( - productId = matterSettings.device.productId.toInt(), - onboardingType = matterSettings.onboardingType, - discriminator = matterSettings.discriminator - ) + val payload = + Payload( + productId = matterSettings.device.productId.toInt(), + onboardingType = matterSettings.onboardingType, + discriminator = matterSettings.discriminator + ) - val qrCode = getQrcodeStringUseCase(payload).successOr("") - val manualPairingCode = getManualPairingCodeStringUseCase(payload).successOr("") + val qrCode = getQrcodeStringUseCase(payload).successOr("") + val manualPairingCode = getManualPairingCodeStringUseCase(payload).successOr("") - _uiState.value = QrcodeUiState.Qrcode(qrCode, manualPairingCode) - } - } + _uiState.value = QrcodeUiState.Qrcode(qrCode, manualPairingCode) + } } + } - override fun onCleared() { - super.onCleared() - Timber.d("onCleared()") - } + override fun onCleared() { + super.onCleared() + Timber.d("onCleared()") + } } sealed interface QrcodeUiState { - object Loading : QrcodeUiState - data class Qrcode(val qrCode: String, val manualPairingCode: String) : QrcodeUiState + object Loading : QrcodeUiState + + data class Qrcode(val qrCode: String, val manualPairingCode: String) : QrcodeUiState } diff --git a/examples/st-device-app/android/App/feature/qrcode/src/test/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleUnitTest.kt b/examples/st-device-app/android/App/feature/qrcode/src/test/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleUnitTest.kt index c2ace440ac17e2..e93b1b7bdeceef 100644 --- a/examples/st-device-app/android/App/feature/qrcode/src/test/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleUnitTest.kt +++ b/examples/st-device-app/android/App/feature/qrcode/src/test/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleUnitTest.kt @@ -1,8 +1,7 @@ package com.samsung.matter.chipstdeviceapp.feature.qrcode -import org.junit.Test - import org.junit.Assert.* +import org.junit.Test /** * Example local unit test, which will execute on the development machine (host). @@ -10,8 +9,8 @@ import org.junit.Assert.* * See [testing documentation](http://d.android.com/tools/testing). */ class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/feature/setup/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/feature/setup/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleInstrumentedTest.kt index 22863e403a3a5a..5a0e773564ee8b 100644 --- a/examples/st-device-app/android/App/feature/setup/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleInstrumentedTest.kt +++ b/examples/st-device-app/android/App/feature/setup/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.samsung.matter.chipstdeviceapp.feature.setup -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * @@ -15,13 +13,10 @@ import org.junit.Assert.* */ @RunWith(AndroidJUnit4::class) class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals( - "com.samsung.matter.chipstdeviceapp.feature.setup.test", - appContext.packageName - ) - } -} \ No newline at end of file + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.samsung.matter.chipstdeviceapp.feature.setup.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupFragment.kt b/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupFragment.kt index 9e2feac45ef934..21013ad976fdd1 100644 --- a/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupFragment.kt +++ b/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupFragment.kt @@ -20,151 +20,153 @@ import com.samsung.matter.chipstdeviceapp.core.model.OnboardingType import com.samsung.matter.chipstdeviceapp.feature.setup.databinding.DialogSetupContinueBinding import com.samsung.matter.chipstdeviceapp.feature.setup.databinding.FragmentSetupBinding import dagger.hilt.android.AndroidEntryPoint +import kotlin.math.abs import kotlinx.coroutines.launch import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import timber.log.Timber -import kotlin.math.abs @AndroidEntryPoint class SetupFragment : Fragment() { - private lateinit var binding: FragmentSetupBinding - private val viewModel by viewModels() + private lateinit var binding: FragmentSetupBinding + private val viewModel by viewModels() - private lateinit var matterSettings: MatterSettings - private var ssid: String = "Unknown" + private lateinit var matterSettings: MatterSettings + private var ssid: String = "Unknown" - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - Timber.d("Hit") - binding = DataBindingUtil.inflate(inflater, R.layout.fragment_setup, container, false) - binding.lifecycleOwner = viewLifecycleOwner + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + Timber.d("Hit") + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_setup, container, false) + binding.lifecycleOwner = viewLifecycleOwner - return binding.root - } + return binding.root + } - @OptIn(ExperimentalSerializationApi::class) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - Timber.d("Hit") - super.onViewCreated(view, savedInstanceState) + @OptIn(ExperimentalSerializationApi::class) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + Timber.d("Hit") + super.onViewCreated(view, savedInstanceState) - (activity as AppCompatActivity).setSupportActionBar(binding.toolbar) - (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) + (activity as AppCompatActivity).setSupportActionBar(binding.toolbar) + (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) - binding.appBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset -> - var ratio = 0F - if (abs(verticalOffset) != 0) { - ratio = abs(verticalOffset).toFloat() / appBarLayout.totalScrollRange.toFloat() - } + binding.appBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset -> + var ratio = 0F + if (abs(verticalOffset) != 0) { + ratio = abs(verticalOffset).toFloat() / appBarLayout.totalScrollRange.toFloat() + } - binding.collapseTitle.alpha = 1f - ratio * 2f + 0.1f - binding.toolbarTitle.alpha = (ratio - 0.5f) * 2f + 0.1f - } - - val args: SetupFragmentArgs by navArgs() - this.matterSettings = Json.decodeFromString(args.setting) - - binding.setupDeviceNameValueText.text = getString(matterSettings.device.deviceNameResId) - binding.setupDiscriminatorEditText.setText(matterSettings.device.discriminator.toString()) - - binding.setupSaveButton.setOnClickListener { - val discriminatorText = binding.setupDiscriminatorEditText.text.toString() - if (discriminatorText.isEmpty()) { - Toast.makeText( - requireActivity(), - getString(R.string.toast_discriminator), - Toast.LENGTH_LONG - ).show() - } else { - val discriminator = discriminatorText.toInt() - if (discriminator > DISCRIMINATOR_LIMIT) { - Toast.makeText( - requireActivity(), - getString(R.string.toast_discriminator), - Toast.LENGTH_LONG - ).show() - } else { - lifecycleScope.launch { - this@SetupFragment.ssid = viewModel.getSSID() - showConfirmDialog() - } - } - } - } + binding.collapseTitle.alpha = 1f - ratio * 2f + 0.1f + binding.toolbarTitle.alpha = (ratio - 0.5f) * 2f + 0.1f } - @OptIn(ExperimentalSerializationApi::class) - private fun showConfirmDialog() { - Timber.d("Hit") - - val dialogBinding: DialogSetupContinueBinding = DataBindingUtil.inflate( - LayoutInflater.from(requireContext()), - R.layout.dialog_setup_continue, - null, - false - ) - - val confirmDialog = - AlertDialog.Builder(requireContext(), R.style.Theme_AppCompat_DayNight_Dialog_Alert) - .setView(dialogBinding.root) - .setCancelable(false) - .create() - - confirmDialog.window?.let { - it.setGravity(Gravity.BOTTOM) - it.setBackgroundDrawableResource(R.drawable.dialog_bg) - } - - dialogBinding.dialogSetupContinueTypeImage.setImageResource(this.matterSettings.device.deviceIconResId) - dialogBinding.dialogSetupContinueSsidText.text = - getString(R.string.setup_ssid_text, this.ssid) - dialogBinding.dialogSetupContinueDeviceNameText.text = - getString(this.matterSettings.device.deviceNameResId) - - val discriminator = binding.setupDiscriminatorEditText.text.toString() - dialogBinding.dialogSetupContinueDiscriminatorText.text = getString( - R.string.setup_discriminator_text, - getString(R.string.hint_discriminator), - discriminator - ) - - dialogBinding.dialogSetupCancelButton.setOnClickListener { - confirmDialog.dismiss() + val args: SetupFragmentArgs by navArgs() + this.matterSettings = Json.decodeFromString(args.setting) + + binding.setupDeviceNameValueText.text = getString(matterSettings.device.deviceNameResId) + binding.setupDiscriminatorEditText.setText(matterSettings.device.discriminator.toString()) + + binding.setupSaveButton.setOnClickListener { + val discriminatorText = binding.setupDiscriminatorEditText.text.toString() + if (discriminatorText.isEmpty()) { + Toast.makeText( + requireActivity(), + getString(R.string.toast_discriminator), + Toast.LENGTH_LONG + ) + .show() + } else { + val discriminator = discriminatorText.toInt() + if (discriminator > DISCRIMINATOR_LIMIT) { + Toast.makeText( + requireActivity(), + getString(R.string.toast_discriminator), + Toast.LENGTH_LONG + ) + .show() + } else { + lifecycleScope.launch { + this@SetupFragment.ssid = viewModel.getSSID() + showConfirmDialog() + } } + } + } + } + + @OptIn(ExperimentalSerializationApi::class) + private fun showConfirmDialog() { + Timber.d("Hit") + + val dialogBinding: DialogSetupContinueBinding = + DataBindingUtil.inflate( + LayoutInflater.from(requireContext()), + R.layout.dialog_setup_continue, + null, + false + ) + + val confirmDialog = + AlertDialog.Builder(requireContext(), R.style.Theme_AppCompat_DayNight_Dialog_Alert) + .setView(dialogBinding.root) + .setCancelable(false) + .create() + + confirmDialog.window?.let { + it.setGravity(Gravity.BOTTOM) + it.setBackgroundDrawableResource(R.drawable.dialog_bg) + } - dialogBinding.dialogSetupStartButton.setOnClickListener { - confirmDialog.dismiss() - - val onboardingType = when (binding.setupOnboardingRadioGroup.checkedRadioButtonId) { - R.id.setup_onboarding_wifi_only -> OnboardingType.WIFI - R.id.setup_onboarding_ble_only -> OnboardingType.BLE - R.id.setup_onboarding_wifi_ble -> OnboardingType.WIFI_BLE - else -> OnboardingType.WIFI - } - Timber.d("MatterOnboardingType:$onboardingType") - this.matterSettings.onboardingType = onboardingType - this.matterSettings.discriminator = discriminator.toInt() - - val jsonSettings = Json.encodeToString(this.matterSettings) - try { - findNavController().navigate( - DeepLink.getDeepLinkRequestForQrcodeFragment(jsonSettings) - ) - } catch (e: Exception) { - Timber.e(e, "navigate failure") - } + dialogBinding.dialogSetupContinueTypeImage.setImageResource( + this.matterSettings.device.deviceIconResId + ) + dialogBinding.dialogSetupContinueSsidText.text = getString(R.string.setup_ssid_text, this.ssid) + dialogBinding.dialogSetupContinueDeviceNameText.text = + getString(this.matterSettings.device.deviceNameResId) + + val discriminator = binding.setupDiscriminatorEditText.text.toString() + dialogBinding.dialogSetupContinueDiscriminatorText.text = + getString( + R.string.setup_discriminator_text, + getString(R.string.hint_discriminator), + discriminator + ) + + dialogBinding.dialogSetupCancelButton.setOnClickListener { confirmDialog.dismiss() } + + dialogBinding.dialogSetupStartButton.setOnClickListener { + confirmDialog.dismiss() + + val onboardingType = + when (binding.setupOnboardingRadioGroup.checkedRadioButtonId) { + R.id.setup_onboarding_wifi_only -> OnboardingType.WIFI + R.id.setup_onboarding_ble_only -> OnboardingType.BLE + R.id.setup_onboarding_wifi_ble -> OnboardingType.WIFI_BLE + else -> OnboardingType.WIFI } - - confirmDialog.show() + Timber.d("MatterOnboardingType:$onboardingType") + this.matterSettings.onboardingType = onboardingType + this.matterSettings.discriminator = discriminator.toInt() + + val jsonSettings = Json.encodeToString(this.matterSettings) + try { + findNavController().navigate(DeepLink.getDeepLinkRequestForQrcodeFragment(jsonSettings)) + } catch (e: Exception) { + Timber.e(e, "navigate failure") + } } - companion object { - private const val DISCRIMINATOR_LIMIT = 4095 - } + confirmDialog.show() + } + + companion object { + private const val DISCRIMINATOR_LIMIT = 4095 + } } diff --git a/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupViewModel.kt b/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupViewModel.kt index cedfe87b5dd12e..536aa5a06b1ad3 100644 --- a/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupViewModel.kt +++ b/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupViewModel.kt @@ -4,28 +4,24 @@ import androidx.lifecycle.* import com.samsung.matter.chipstdeviceapp.core.common.successOr import com.samsung.matter.chipstdeviceapp.core.domain.usecase.network.GetSSIDUseCase import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import kotlinx.coroutines.async import timber.log.Timber -import javax.inject.Inject @HiltViewModel -class SetupViewModel @Inject constructor( - private val getSSIDUseCase: GetSSIDUseCase -) : ViewModel() { +class SetupViewModel @Inject constructor(private val getSSIDUseCase: GetSSIDUseCase) : ViewModel() { - override fun onCleared() { - Timber.d("Hit") - super.onCleared() - } + override fun onCleared() { + Timber.d("Hit") + super.onCleared() + } - suspend fun getSSID(): String { - Timber.d("Hit") - val deferred = viewModelScope.async { - getSSIDUseCase().successOr("Unknown") - } + suspend fun getSSID(): String { + Timber.d("Hit") + val deferred = viewModelScope.async { getSSIDUseCase().successOr("Unknown") } - val ssid = deferred.await() - Timber.d("ssid:${ssid}") - return ssid - } -} \ No newline at end of file + val ssid = deferred.await() + Timber.d("ssid:${ssid}") + return ssid + } +} diff --git a/examples/st-device-app/android/App/feature/setup/src/test/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleUnitTest.kt b/examples/st-device-app/android/App/feature/setup/src/test/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleUnitTest.kt index a6f97ceb22cd9d..b8e0584ad1cbc2 100644 --- a/examples/st-device-app/android/App/feature/setup/src/test/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleUnitTest.kt +++ b/examples/st-device-app/android/App/feature/setup/src/test/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleUnitTest.kt @@ -1,8 +1,7 @@ package com.samsung.matter.chipstdeviceapp.feature.setup -import org.junit.Test - import org.junit.Assert.* +import org.junit.Test /** * Example local unit test, which will execute on the development machine (host). @@ -10,8 +9,8 @@ import org.junit.Assert.* * See [testing documentation](http://d.android.com/tools/testing). */ class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} From bc4727e24bbc80e1ea53c7a9c4b843d0e244f01a Mon Sep 17 00:00:00 2001 From: Charles Kim Date: Thu, 20 Jul 2023 09:04:16 +0900 Subject: [PATCH 26/36] scritps: fix merge conflicts Signed-off-by: Charles Kim --- docs/examples/index.md | 2 +- .../App/app/src/main/res/values/strings.xml | 3 - .../App/core/common/consumer-rules.pro | 0 .../core/common/ExampleInstrumentedTest.kt | 22 ------- .../android/App/core/data/consumer-rules.pro | 0 .../App/core/domain/consumer-rules.pro | 0 .../core/domain/ExampleUnitTest.kt | 16 ------ .../App/core/matter/consumer-rules.pro | 0 .../core/matter/ExampleInstrumentedTest.kt | 22 ------- .../core/matter/ExampleUnitTest.kt | 16 ------ .../android/App/core/model/consumer-rules.pro | 0 .../chipstdeviceapp/core/model/Payload.kt | 3 - .../App/feature/main/consumer-rules.pro | 0 .../feature/main/ExampleInstrumentedTest.kt | 22 ------- .../feature/main/ui/adapter/MenuAdapter.kt | 34 ----------- .../main/ui/adapter/ViewBindingAdapter.kt | 10 ---- .../ui/recyclerview/DataBindingViewHolder.kt | 14 ----- .../main/ui/recyclerview/ItemDiffCallback.kt | 14 ----- .../ui/recyclerview/ListBindingAdapter.kt | 25 -------- .../main/src/main/res/values/strings.xml | 4 -- .../feature/main/ExampleUnitTest.kt | 16 ------ .../App/feature/qrcode/consumer-rules.pro | 0 .../feature/qrcode/ExampleInstrumentedTest.kt | 22 ------- .../feature/qrcode/ExampleUnitTest.kt | 16 ------ .../App/feature/setup/consumer-rules.pro | 0 .../feature/setup/ExampleInstrumentedTest.kt | 22 ------- .../feature/setup/ExampleUnitTest.kt | 16 ------ .../android/.gn | 2 +- .../android/App/.gitignore | 0 .../android/App/app/.gitignore | 0 .../android/App/app/build.gradle.kts | 11 ++-- .../android/App/app/proguard-rules.pro | 0 .../device/app}/ExampleInstrumentedTest.kt | 4 +- .../App/app/src/main/AndroidManifest.xml | 4 +- .../app/src/main/ic_launcher-playstore.png | Bin .../com/matter/virtual/device/app}/App.kt | 2 +- .../virtual/device/app}/MainActivity.kt | 4 +- .../virtual/device/app}/TimberDebugTree.kt | 2 +- .../res/drawable/ic_launcher_background.xml | 0 .../res/drawable/ic_launcher_foreground.xml | 0 .../app/src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../app/src/main/res/navigation/nav_graph.xml | 0 .../app/src/main/res/values-night/colors.xml | 0 .../App/app/src/main/res/values/strings.xml | 3 + .../virtual/device/app}/ExampleUnitTest.kt | 2 +- .../android/App/build.gradle.kts | 0 .../android/App/buildSrc/.gitignore | 0 .../android/App/buildSrc/build.gradle.kts | 0 .../main/java/com/matter}/buildsrc/Deps.kt | 2 +- .../java/com/matter}/buildsrc/Versions.kt | 2 +- .../android/App/core/common/.gitignore | 0 .../android/App/core/common/build.gradle.kts | 6 +- .../App/core/common/proguard-rules.pro | 0 .../core/common}/ExampleInstrumentedTest.kt | 4 +- .../core/common/src/main/AndroidManifest.xml | 0 .../device/app}/core/common/DeepLink.kt | 7 +-- .../virtual/device/app}/core/common/Device.kt | 15 +---- .../app}/core/common/MatterConstants.kt | 6 +- .../device/app}/core/common/MatterSettings.kt | 4 +- .../device/app}/core/common/QrcodeUtil.kt | 2 +- .../virtual/device/app}/core/common/Result.kt | 2 +- .../app}/core/common/di/CoroutinesModule.kt | 2 +- .../core/common/di/CoroutinesQualifiers.kt | 2 +- .../common/ui/DisableAppBarLayoutBehavior.kt | 2 +- .../src/main/res/drawable/menu_item_bg.xml | 0 .../res/drawable/round_device_unknown_24.xml | 0 .../main/res/drawable/round_toggle_on_24.xml | 0 .../src/main/res/values-night/colors.xml | 0 .../common/src/main/res/values/colors.xml | 0 .../common/src/main/res/values/dimens.xml | 0 .../common/src/main/res/values/strings.xml | 2 +- .../common/src/main/res/values/themes.xml | 0 .../app/core/common}/ExampleUnitTest.kt | 2 +- .../android/App/core/data/.gitignore | 0 .../android/App/core/data/build.gradle.kts | 6 +- .../android/App/core/data/proguard-rules.pro | 0 .../app/core/data}/ExampleInstrumentedTest.kt | 4 +- .../core/data/src/main/AndroidManifest.xml | 0 .../device/app}/core/data/di/DataModule.kt | 7 ++- .../core/data/repository/MatterRepository.kt | 4 +- .../data/repository/MatterRepositoryImpl.kt | 6 +- .../core/data/repository/NetworkRepository.kt | 2 +- .../data/repository/NetworkRepositoryImpl.kt | 2 +- .../device/app/core/data}/ExampleUnitTest.kt | 2 +- .../android/App/core/domain/.gitignore | 0 .../android/App/core/domain/build.gradle.kts | 6 +- .../App/core/domain/proguard-rules.pro | 0 .../core/domain/ExampleInstrumentedTest.kt | 22 +++++++ .../core/domain/src/main/AndroidManifest.xml | 0 .../app}/core/domain/CoroutineUseCase.kt | 4 +- .../core/domain/NonParamCoroutineUseCase.kt | 4 +- .../GetManualPairingCodeStringUseCase.kt | 10 ++-- .../usecase/matter/GetQrCodeStringUseCase.kt | 10 ++-- .../domain/usecase/network/GetSSIDUseCase.kt | 8 +-- .../app/core/domain}/ExampleUnitTest.kt | 2 +- .../android/App/core/matter/.gitignore | 0 .../android/App/core/matter/build.gradle.kts | 6 +- .../App/core/matter/proguard-rules.pro | 0 .../core/matter/ExampleInstrumentedTest.kt | 22 +++++++ .../core/matter/src/main/AndroidManifest.xml | 0 .../device/app}/core/matter/MatterApi.kt | 6 +- .../device/app}/core/matter/model/Payload.kt | 10 ++-- .../device/app/core/matter/ExampleUnitTest.kt | 16 ++++++ .../android/App/core/model/.gitignore | 0 .../android/App/core/model/build.gradle.kts | 6 +- .../android/App/core/model/proguard-rules.pro | 0 .../app/core/model/ExampleInstrumentedTest.kt | 22 +++++++ .../core/model/src/main/AndroidManifest.xml | 0 .../device/app}/core/model/OnobardingType.kt | 2 +- .../virtual/device/app/core/model/Payload.kt | 3 + .../device/app/core/model/ExampleUnitTest.kt | 16 ++++++ .../android/App/feature/main/.gitignore | 0 .../android/App/feature/main/build.gradle.kts | 6 +- .../App/feature/main/proguard-rules.pro | 0 .../feature/main/ExampleInstrumentedTest.kt | 22 +++++++ .../feature/main/src/main/AndroidManifest.xml | 0 .../device/app/feature/main/BindingAdapter.kt | 13 +++++ .../device/app/feature/main}/MainFragment.kt | 37 ++++++------ .../device/app/feature/main/MenuAdapter.kt | 46 +++++++++++++++ .../main}/VerticalSpaceItemDecoration.kt | 2 +- .../device/app}/feature/main/model/Menu.kt | 8 +-- .../src/main/res/layout/fragment_main.xml | 0 .../main/src/main/res/layout/item_menu.xml | 6 +- .../main/res/navigation/main_nav_graph.xml | 2 +- .../main/src/main/res/values/strings.xml | 4 ++ .../app/feature/main/ExampleUnitTest.kt | 16 ++++++ .../android/App/feature/qrcode/.gitignore | 0 .../App/feature/qrcode}/build.gradle.kts | 6 +- .../App/feature/qrcode/proguard-rules.pro | 0 .../qrcode}/ExampleInstrumentedTest.kt | 4 +- .../qrcode/src/main/AndroidManifest.xml | 0 .../app}/feature/qrcode/QrcodeFragment.kt | 15 ++--- .../app}/feature/qrcode/QrcodeViewModel.kt | 13 ++--- .../src/main/res/layout/fragment_qrcode.xml | 4 +- .../main/res/navigation/qrcode_nav_graph.xml | 4 +- .../qrcode/src/main/res/values/strings.xml | 0 .../app/feature/qrcode/ExampleUnitTest.kt | 16 ++++++ .../android/App/feature/setup/.gitignore | 0 .../App/feature/setup}/build.gradle.kts | 6 +- .../App/feature/setup/proguard-rules.pro | 0 .../feature/setup/ExampleInstrumentedTest.kt | 22 +++++++ .../setup/src/main/AndroidManifest.xml | 0 .../app}/feature/setup/SetupFragment.kt | 12 ++-- .../app}/feature/setup/SetupViewModel.kt | 6 +- .../setup/src/main/res/drawable/dialog_bg.xml | 0 .../round_notification_important_24.xml | 0 .../main/res/layout/dialog_setup_continue.xml | 0 .../src/main/res/layout/fragment_setup.xml | 0 .../main/res/navigation/setup_nav_graph.xml | 4 +- .../setup/src/main/res/values-ko/strings.xml | 2 +- .../src/main/res/values-night/colors.xml | 0 .../setup/src/main/res/values/colors.xml | 0 .../setup/src/main/res/values/strings.xml | 2 +- .../app/feature/setup/ExampleUnitTest.kt | 16 ++++++ .../android/App/gradle.properties | 2 +- .../App/gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../android/App/gradlew | 2 +- .../android/App/gradlew.bat | 0 .../android/App/settings.gradle.kts | 2 +- .../android/BUILD.gn | 20 +++---- .../android/README.md | 10 ++-- .../android/args.gni | 4 +- .../android/build_overrides | 0 .../android/java/AppImpl.cpp | 8 +-- .../android/java/AppImpl.h | 2 +- .../android/java/ClusterChangeAttribute.cpp | 4 +- .../android/java/DeviceApp-JNI.cpp} | 54 +++++++++--------- .../android/java/DeviceApp-JNI.h} | 14 ++--- .../android/java/JNIDACProvider.cpp | 2 +- .../android/java/JNIDACProvider.h | 2 +- .../android/java/OnOffManager.cpp | 18 +++--- .../android/java/OnOffManager.h | 2 +- .../virtual/device/app}/DACProvider.java | 2 +- .../matter/virtual/device/app/DeviceApp.java} | 12 ++-- .../device/app/DeviceAppCallback.java} | 6 +- .../virtual/device/app}/OnOffManager.java | 5 +- .../android/third_party/connectedhomeip | 0 .../virtual-device-common}/BUILD.gn | 6 +- .../include/CHIPProjectAppConfig.h | 0 .../virtual-device-app.matter} | 0 .../virtual-device-app.zap} | 0 scripts/build/build/targets.py | 3 +- scripts/build/builders/android.py | 20 +++---- 196 files changed, 526 insertions(+), 569 deletions(-) delete mode 100644 examples/st-device-app/android/App/app/src/main/res/values/strings.xml delete mode 100644 examples/st-device-app/android/App/core/common/consumer-rules.pro delete mode 100644 examples/st-device-app/android/App/core/common/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleInstrumentedTest.kt delete mode 100644 examples/st-device-app/android/App/core/data/consumer-rules.pro delete mode 100644 examples/st-device-app/android/App/core/domain/consumer-rules.pro delete mode 100644 examples/st-device-app/android/App/core/domain/src/test/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleUnitTest.kt delete mode 100644 examples/st-device-app/android/App/core/matter/consumer-rules.pro delete mode 100644 examples/st-device-app/android/App/core/matter/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleInstrumentedTest.kt delete mode 100644 examples/st-device-app/android/App/core/matter/src/test/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleUnitTest.kt delete mode 100644 examples/st-device-app/android/App/core/model/consumer-rules.pro delete mode 100644 examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/Payload.kt delete mode 100644 examples/st-device-app/android/App/feature/main/consumer-rules.pro delete mode 100644 examples/st-device-app/android/App/feature/main/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleInstrumentedTest.kt delete mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/MenuAdapter.kt delete mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/ViewBindingAdapter.kt delete mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/DataBindingViewHolder.kt delete mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ItemDiffCallback.kt delete mode 100644 examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ListBindingAdapter.kt delete mode 100644 examples/st-device-app/android/App/feature/main/src/main/res/values/strings.xml delete mode 100644 examples/st-device-app/android/App/feature/main/src/test/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleUnitTest.kt delete mode 100644 examples/st-device-app/android/App/feature/qrcode/consumer-rules.pro delete mode 100644 examples/st-device-app/android/App/feature/qrcode/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleInstrumentedTest.kt delete mode 100644 examples/st-device-app/android/App/feature/qrcode/src/test/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleUnitTest.kt delete mode 100644 examples/st-device-app/android/App/feature/setup/consumer-rules.pro delete mode 100644 examples/st-device-app/android/App/feature/setup/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleInstrumentedTest.kt delete mode 100644 examples/st-device-app/android/App/feature/setup/src/test/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleUnitTest.kt rename examples/{st-device-app => virtual-device-app}/android/.gn (94%) rename examples/{st-device-app => virtual-device-app}/android/App/.gitignore (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/.gitignore (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/build.gradle.kts (90%) rename examples/{st-device-app => virtual-device-app}/android/App/app/proguard-rules.pro (100%) rename examples/{st-device-app/android/App/app/src/androidTest/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/app/src/androidTest/java/com/matter/virtual/device/app}/ExampleInstrumentedTest.kt (81%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/AndroidManifest.xml (88%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/ic_launcher-playstore.png (100%) rename examples/{st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/app/src/main/java/com/matter/virtual/device/app}/App.kt (84%) rename examples/{st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/app/src/main/java/com/matter/virtual/device/app}/MainActivity.kt (93%) rename examples/{st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/app/src/main/java/com/matter/virtual/device/app}/TimberDebugTree.kt (88%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/drawable/ic_launcher_background.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/drawable/ic_launcher_foreground.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/layout/activity_main.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/navigation/nav_graph.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/app/src/main/res/values-night/colors.xml (100%) create mode 100644 examples/virtual-device-app/android/App/app/src/main/res/values/strings.xml rename examples/{st-device-app/android/App/app/src/test/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/app/src/test/java/com/matter/virtual/device/app}/ExampleUnitTest.kt (87%) rename examples/{st-device-app => virtual-device-app}/android/App/build.gradle.kts (100%) rename examples/{st-device-app => virtual-device-app}/android/App/buildSrc/.gitignore (100%) rename examples/{st-device-app => virtual-device-app}/android/App/buildSrc/build.gradle.kts (100%) rename examples/{st-device-app/android/App/buildSrc/src/main/java/com/samsung => virtual-device-app/android/App/buildSrc/src/main/java/com/matter}/buildsrc/Deps.kt (98%) rename examples/{st-device-app/android/App/buildSrc/src/main/java/com/samsung => virtual-device-app/android/App/buildSrc/src/main/java/com/matter}/buildsrc/Versions.kt (84%) rename examples/{st-device-app => virtual-device-app}/android/App/core/common/.gitignore (100%) rename examples/{st-device-app => virtual-device-app}/android/App/core/common/build.gradle.kts (91%) rename examples/{st-device-app => virtual-device-app}/android/App/core/common/proguard-rules.pro (100%) rename examples/{st-device-app/android/App/core/model/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/model => virtual-device-app/android/App/core/common/src/androidTest/java/com/matter/virtual/device/app/core/common}/ExampleInstrumentedTest.kt (78%) rename examples/{st-device-app => virtual-device-app}/android/App/core/common/src/main/AndroidManifest.xml (100%) rename examples/{st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app}/core/common/DeepLink.kt (61%) rename examples/{st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app}/core/common/Device.kt (72%) rename examples/{st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app}/core/common/MatterConstants.kt (64%) rename examples/{st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app}/core/common/MatterSettings.kt (67%) rename examples/{st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app}/core/common/QrcodeUtil.kt (93%) rename examples/{st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app}/core/common/Result.kt (88%) rename examples/{st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app}/core/common/di/CoroutinesModule.kt (93%) rename examples/{st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app}/core/common/di/CoroutinesQualifiers.kt (86%) rename examples/{st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app}/core/common/ui/DisableAppBarLayoutBehavior.kt (92%) rename examples/{st-device-app => virtual-device-app}/android/App/core/common/src/main/res/drawable/menu_item_bg.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/core/common/src/main/res/drawable/round_device_unknown_24.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/core/common/src/main/res/drawable/round_toggle_on_24.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/core/common/src/main/res/values-night/colors.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/core/common/src/main/res/values/colors.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/core/common/src/main/res/values/dimens.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/core/common/src/main/res/values/strings.xml (69%) rename examples/{st-device-app => virtual-device-app}/android/App/core/common/src/main/res/values/themes.xml (100%) rename examples/{st-device-app/android/App/core/data/src/test/java/com/samsung/matter/chipstdeviceapp/core/data => virtual-device-app/android/App/core/common/src/test/java/com/matter/virtual/device/app/core/common}/ExampleUnitTest.kt (85%) rename examples/{st-device-app => virtual-device-app}/android/App/core/data/.gitignore (100%) rename examples/{st-device-app => virtual-device-app}/android/App/core/data/build.gradle.kts (90%) rename examples/{st-device-app => virtual-device-app}/android/App/core/data/proguard-rules.pro (100%) rename examples/{st-device-app/android/App/core/domain/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/domain => virtual-device-app/android/App/core/data/src/androidTest/java/com/matter/virtual/device/app/core/data}/ExampleInstrumentedTest.kt (78%) rename examples/{st-device-app => virtual-device-app}/android/App/core/data/src/main/AndroidManifest.xml (100%) rename examples/{st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app}/core/data/di/DataModule.kt (52%) rename examples/{st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app}/core/data/repository/MatterRepository.kt (53%) rename examples/{st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app}/core/data/repository/MatterRepositoryImpl.kt (67%) rename examples/{st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app}/core/data/repository/NetworkRepository.kt (50%) rename examples/{st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app}/core/data/repository/NetworkRepositoryImpl.kt (93%) rename examples/{st-device-app/android/App/core/model/src/test/java/com/samsung/matter/chipstdeviceapp/core/model => virtual-device-app/android/App/core/data/src/test/java/com/matter/virtual/device/app/core/data}/ExampleUnitTest.kt (84%) rename examples/{st-device-app => virtual-device-app}/android/App/core/domain/.gitignore (100%) rename examples/{st-device-app => virtual-device-app}/android/App/core/domain/build.gradle.kts (89%) rename examples/{st-device-app => virtual-device-app}/android/App/core/domain/proguard-rules.pro (100%) create mode 100644 examples/virtual-device-app/android/App/core/domain/src/androidTest/java/com/matter/virtual/device/app/core/domain/ExampleInstrumentedTest.kt rename examples/{st-device-app => virtual-device-app}/android/App/core/domain/src/main/AndroidManifest.xml (100%) rename examples/{st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app}/core/domain/CoroutineUseCase.kt (81%) rename examples/{st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app}/core/domain/NonParamCoroutineUseCase.kt (80%) rename examples/{st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app}/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt (53%) rename examples/{st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app}/core/domain/usecase/matter/GetQrCodeStringUseCase.kt (52%) rename examples/{st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app}/core/domain/usecase/network/GetSSIDUseCase.kt (54%) rename examples/{st-device-app/android/App/core/common/src/test/java/com/samsung/matter/chipstdeviceapp/core/common => virtual-device-app/android/App/core/domain/src/test/java/com/matter/virtual/device/app/core/domain}/ExampleUnitTest.kt (84%) rename examples/{st-device-app => virtual-device-app}/android/App/core/matter/.gitignore (100%) rename examples/{st-device-app => virtual-device-app}/android/App/core/matter/build.gradle.kts (91%) rename examples/{st-device-app => virtual-device-app}/android/App/core/matter/proguard-rules.pro (100%) create mode 100644 examples/virtual-device-app/android/App/core/matter/src/androidTest/java/com/matter/virtual/device/app/core/matter/ExampleInstrumentedTest.kt rename examples/{st-device-app => virtual-device-app}/android/App/core/matter/src/main/AndroidManifest.xml (100%) rename examples/{st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app}/core/matter/MatterApi.kt (84%) rename examples/{st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app}/core/matter/model/Payload.kt (76%) create mode 100644 examples/virtual-device-app/android/App/core/matter/src/test/java/com/matter/virtual/device/app/core/matter/ExampleUnitTest.kt rename examples/{st-device-app => virtual-device-app}/android/App/core/model/.gitignore (100%) rename examples/{st-device-app => virtual-device-app}/android/App/core/model/build.gradle.kts (87%) rename examples/{st-device-app => virtual-device-app}/android/App/core/model/proguard-rules.pro (100%) create mode 100644 examples/virtual-device-app/android/App/core/model/src/androidTest/java/com/matter/virtual/device/app/core/model/ExampleInstrumentedTest.kt rename examples/{st-device-app => virtual-device-app}/android/App/core/model/src/main/AndroidManifest.xml (100%) rename examples/{st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/core/model/src/main/java/com/matter/virtual/device/app}/core/model/OnobardingType.kt (81%) create mode 100644 examples/virtual-device-app/android/App/core/model/src/main/java/com/matter/virtual/device/app/core/model/Payload.kt create mode 100644 examples/virtual-device-app/android/App/core/model/src/test/java/com/matter/virtual/device/app/core/model/ExampleUnitTest.kt rename examples/{st-device-app => virtual-device-app}/android/App/feature/main/.gitignore (100%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/main/build.gradle.kts (92%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/main/proguard-rules.pro (100%) create mode 100644 examples/virtual-device-app/android/App/feature/main/src/androidTest/java/com/matter/virtual/device/app/feature/main/ExampleInstrumentedTest.kt rename examples/{st-device-app => virtual-device-app}/android/App/feature/main/src/main/AndroidManifest.xml (100%) create mode 100644 examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/BindingAdapter.kt rename examples/{st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui => virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main}/MainFragment.kt (74%) create mode 100644 examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/MenuAdapter.kt rename examples/{st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview => virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main}/VerticalSpaceItemDecoration.kt (89%) rename examples/{st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app}/feature/main/model/Menu.kt (60%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/main/src/main/res/layout/fragment_main.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/main/src/main/res/layout/item_menu.xml (91%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/main/src/main/res/navigation/main_nav_graph.xml (83%) create mode 100644 examples/virtual-device-app/android/App/feature/main/src/main/res/values/strings.xml create mode 100644 examples/virtual-device-app/android/App/feature/main/src/test/java/com/matter/virtual/device/app/feature/main/ExampleUnitTest.kt rename examples/{st-device-app => virtual-device-app}/android/App/feature/qrcode/.gitignore (100%) rename examples/{st-device-app/android/App/feature/setup => virtual-device-app/android/App/feature/qrcode}/build.gradle.kts (92%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/qrcode/proguard-rules.pro (100%) rename examples/{st-device-app/android/App/core/data/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/data => virtual-device-app/android/App/feature/qrcode/src/androidTest/java/com/matter/virtual/device/app/feature/qrcode}/ExampleInstrumentedTest.kt (83%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/qrcode/src/main/AndroidManifest.xml (100%) rename examples/{st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/feature/qrcode/src/main/java/com/matter/virtual/device/app}/feature/qrcode/QrcodeFragment.kt (91%) rename examples/{st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/feature/qrcode/src/main/java/com/matter/virtual/device/app}/feature/qrcode/QrcodeViewModel.kt (76%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml (98%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/qrcode/src/main/res/navigation/qrcode_nav_graph.xml (73%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/qrcode/src/main/res/values/strings.xml (100%) create mode 100644 examples/virtual-device-app/android/App/feature/qrcode/src/test/java/com/matter/virtual/device/app/feature/qrcode/ExampleUnitTest.kt rename examples/{st-device-app => virtual-device-app}/android/App/feature/setup/.gitignore (100%) rename examples/{st-device-app/android/App/feature/qrcode => virtual-device-app/android/App/feature/setup}/build.gradle.kts (92%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/setup/proguard-rules.pro (100%) create mode 100644 examples/virtual-device-app/android/App/feature/setup/src/androidTest/java/com/matter/virtual/device/app/feature/setup/ExampleInstrumentedTest.kt rename examples/{st-device-app => virtual-device-app}/android/App/feature/setup/src/main/AndroidManifest.xml (100%) rename examples/{st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/feature/setup/src/main/java/com/matter/virtual/device/app}/feature/setup/SetupFragment.kt (92%) rename examples/{st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp => virtual-device-app/android/App/feature/setup/src/main/java/com/matter/virtual/device/app}/feature/setup/SetupViewModel.kt (73%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/setup/src/main/res/drawable/dialog_bg.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/setup/src/main/res/drawable/round_notification_important_24.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/setup/src/main/res/layout/dialog_setup_continue.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/setup/src/main/res/layout/fragment_setup.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/setup/src/main/res/navigation/setup_nav_graph.xml (73%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/setup/src/main/res/values-ko/strings.xml (60%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/setup/src/main/res/values-night/colors.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/setup/src/main/res/values/colors.xml (100%) rename examples/{st-device-app => virtual-device-app}/android/App/feature/setup/src/main/res/values/strings.xml (92%) create mode 100644 examples/virtual-device-app/android/App/feature/setup/src/test/java/com/matter/virtual/device/app/feature/setup/ExampleUnitTest.kt rename examples/{st-device-app => virtual-device-app}/android/App/gradle.properties (96%) rename examples/{st-device-app => virtual-device-app}/android/App/gradle/wrapper/gradle-wrapper.jar (100%) rename examples/{st-device-app => virtual-device-app}/android/App/gradle/wrapper/gradle-wrapper.properties (100%) rename examples/{st-device-app => virtual-device-app}/android/App/gradlew (99%) mode change 100755 => 100644 rename examples/{st-device-app => virtual-device-app}/android/App/gradlew.bat (100%) rename examples/{st-device-app => virtual-device-app}/android/App/settings.gradle.kts (92%) rename examples/{st-device-app => virtual-device-app}/android/BUILD.gn (78%) rename examples/{st-device-app => virtual-device-app}/android/README.md (79%) rename examples/{st-device-app => virtual-device-app}/android/args.gni (88%) rename examples/{st-device-app => virtual-device-app}/android/build_overrides (100%) rename examples/{st-device-app => virtual-device-app}/android/java/AppImpl.cpp (94%) rename examples/{st-device-app => virtual-device-app}/android/java/AppImpl.h (93%) rename examples/{st-device-app => virtual-device-app}/android/java/ClusterChangeAttribute.cpp (92%) rename examples/{st-device-app/android/java/StDeviceApp-JNI.cpp => virtual-device-app/android/java/DeviceApp-JNI.cpp} (68%) rename examples/{st-device-app/android/java/StDeviceApp-JNI.h => virtual-device-app/android/java/DeviceApp-JNI.h} (75%) rename examples/{st-device-app => virtual-device-app}/android/java/JNIDACProvider.cpp (99%) rename examples/{st-device-app => virtual-device-app}/android/java/JNIDACProvider.h (97%) rename examples/{st-device-app => virtual-device-app}/android/java/OnOffManager.cpp (85%) rename examples/{st-device-app => virtual-device-app}/android/java/OnOffManager.h (97%) rename examples/{st-device-app/android/java/src/com/samsung/matter/stdeviceapp => virtual-device-app/android/java/src/com/matter/virtual/device/app}/DACProvider.java (95%) rename examples/{st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java => virtual-device-app/android/java/src/com/matter/virtual/device/app/DeviceApp.java} (86%) rename examples/{st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java => virtual-device-app/android/java/src/com/matter/virtual/device/app/DeviceAppCallback.java} (82%) rename examples/{st-device-app/android/java/src/com/samsung/matter/stdeviceapp => virtual-device-app/android/java/src/com/matter/virtual/device/app}/OnOffManager.java (75%) rename examples/{st-device-app => virtual-device-app}/android/third_party/connectedhomeip (100%) rename examples/{st-device-app/st-device-common => virtual-device-app/virtual-device-common}/BUILD.gn (83%) rename examples/{st-device-app/st-device-common => virtual-device-app/virtual-device-common}/include/CHIPProjectAppConfig.h (100%) rename examples/{st-device-app/st-device-common/st-device-app.matter => virtual-device-app/virtual-device-common/virtual-device-app.matter} (100%) rename examples/{st-device-app/st-device-common/st-device-app.zap => virtual-device-app/virtual-device-common/virtual-device-app.zap} (100%) diff --git a/docs/examples/index.md b/docs/examples/index.md index 4f461a6bebede7..e7b6224bdda1a1 100644 --- a/docs/examples/index.md +++ b/docs/examples/index.md @@ -84,7 +84,7 @@ java-matter-controller/README :glob: :maxdepth: 1 -st-device-app/**/README +virtual-device-app/**/README ``` ## Lighting example diff --git a/examples/st-device-app/android/App/app/src/main/res/values/strings.xml b/examples/st-device-app/android/App/app/src/main/res/values/strings.xml deleted file mode 100644 index fdaa4e82d1e679..00000000000000 --- a/examples/st-device-app/android/App/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - ST Matter Device - diff --git a/examples/st-device-app/android/App/core/common/consumer-rules.pro b/examples/st-device-app/android/App/core/common/consumer-rules.pro deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/examples/st-device-app/android/App/core/common/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/core/common/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleInstrumentedTest.kt deleted file mode 100644 index a3f8a2a0a69722..00000000000000 --- a/examples/st-device-app/android/App/core/common/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.core.common - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.* -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.core.common.test", appContext.packageName) - } -} diff --git a/examples/st-device-app/android/App/core/data/consumer-rules.pro b/examples/st-device-app/android/App/core/data/consumer-rules.pro deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/examples/st-device-app/android/App/core/domain/consumer-rules.pro b/examples/st-device-app/android/App/core/domain/consumer-rules.pro deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/examples/st-device-app/android/App/core/domain/src/test/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleUnitTest.kt b/examples/st-device-app/android/App/core/domain/src/test/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleUnitTest.kt deleted file mode 100644 index baad81b9e2cc63..00000000000000 --- a/examples/st-device-app/android/App/core/domain/src/test/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.core.domain - -import org.junit.Assert.* -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} diff --git a/examples/st-device-app/android/App/core/matter/consumer-rules.pro b/examples/st-device-app/android/App/core/matter/consumer-rules.pro deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/examples/st-device-app/android/App/core/matter/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/core/matter/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleInstrumentedTest.kt deleted file mode 100644 index 843cd8d134b8d4..00000000000000 --- a/examples/st-device-app/android/App/core/matter/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.core.matter - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.* -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.core.matter.test", appContext.packageName) - } -} diff --git a/examples/st-device-app/android/App/core/matter/src/test/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleUnitTest.kt b/examples/st-device-app/android/App/core/matter/src/test/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleUnitTest.kt deleted file mode 100644 index e8630a44c49a93..00000000000000 --- a/examples/st-device-app/android/App/core/matter/src/test/java/com/samsung/matter/chipstdeviceapp/core/matter/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.core.matter - -import org.junit.Assert.* -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} diff --git a/examples/st-device-app/android/App/core/model/consumer-rules.pro b/examples/st-device-app/android/App/core/model/consumer-rules.pro deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/Payload.kt b/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/Payload.kt deleted file mode 100644 index de84c9d14e7a4d..00000000000000 --- a/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/Payload.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.core.model - -data class Payload(val productId: Int, val onboardingType: OnboardingType, val discriminator: Int) diff --git a/examples/st-device-app/android/App/feature/main/consumer-rules.pro b/examples/st-device-app/android/App/feature/main/consumer-rules.pro deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/examples/st-device-app/android/App/feature/main/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/feature/main/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleInstrumentedTest.kt deleted file mode 100644 index 8c0acce971f61a..00000000000000 --- a/examples/st-device-app/android/App/feature/main/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.feature.main - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.* -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.feature.main.test", appContext.packageName) - } -} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/MenuAdapter.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/MenuAdapter.kt deleted file mode 100644 index 5581cd036fe83d..00000000000000 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/MenuAdapter.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.feature.main.ui.adapter - -import com.samsung.matter.chipstdeviceapp.feature.main.BR -import com.samsung.matter.chipstdeviceapp.feature.main.R -import com.samsung.matter.chipstdeviceapp.feature.main.model.Menu -import com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview.DataBindingViewHolder -import com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview.ItemDiffCallback -import com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview.ListBindingAdapter - -internal class MenuAdapter(menus: List, private val itemHandler: ItemHandler) : - ListBindingAdapter( - ItemDiffCallback( - onItemsTheSame = { old, new -> old.titleResId == new.titleResId }, - onContentsTheSame = { old, new -> old == new } - ) - ) { - - init { - submitList(menus) - } - - override fun getItemViewType(position: Int): Int { - return R.layout.item_menu - } - - override fun viewBindViewHolder(holder: DataBindingViewHolder, position: Int) { - super.viewBindViewHolder(holder, position) - holder.binding.setVariable(BR.itemHandler, itemHandler) - } - - interface ItemHandler { - fun onClick(item: Menu) - } -} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/ViewBindingAdapter.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/ViewBindingAdapter.kt deleted file mode 100644 index 89eb93936eafc9..00000000000000 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/adapter/ViewBindingAdapter.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.feature.main.ui.adapter - -import androidx.annotation.DrawableRes -import androidx.appcompat.widget.AppCompatImageView -import androidx.databinding.BindingAdapter - -@BindingAdapter("setSrc") -fun AppCompatImageView.bindSetSrc(@DrawableRes imgResId: Int) { - this.setImageResource(imgResId) -} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/DataBindingViewHolder.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/DataBindingViewHolder.kt deleted file mode 100644 index 1cc569ccc7ff7e..00000000000000 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/DataBindingViewHolder.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview - -import androidx.databinding.ViewDataBinding -import androidx.recyclerview.widget.RecyclerView -import com.samsung.matter.chipstdeviceapp.feature.main.BR - -class DataBindingViewHolder(val binding: ViewDataBinding) : - RecyclerView.ViewHolder(binding.root) { - - fun bind(item: T) { - binding.setVariable(BR.item, item) - binding.executePendingBindings() - } -} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ItemDiffCallback.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ItemDiffCallback.kt deleted file mode 100644 index af7964905b3334..00000000000000 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ItemDiffCallback.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview - -import androidx.recyclerview.widget.DiffUtil - -class ItemDiffCallback( - val onItemsTheSame: (T, T) -> Boolean, - val onContentsTheSame: (T, T) -> Boolean -) : DiffUtil.ItemCallback() { - - override fun areItemsTheSame(oldItem: T, newItem: T): Boolean = onItemsTheSame(oldItem, newItem) - - override fun areContentsTheSame(oldItem: T, newItem: T): Boolean = - onContentsTheSame(oldItem, newItem) -} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ListBindingAdapter.kt b/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ListBindingAdapter.kt deleted file mode 100644 index 94cb5d6abbe92c..00000000000000 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/ListBindingAdapter.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview - -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.databinding.DataBindingUtil -import androidx.databinding.ViewDataBinding -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.ListAdapter - -abstract class ListBindingAdapter(diffCallback: DiffUtil.ItemCallback) : - ListAdapter>(diffCallback) { - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataBindingViewHolder { - val layoutInflater = LayoutInflater.from(parent.context) - val binding = DataBindingUtil.inflate(layoutInflater, viewType, parent, false) - return DataBindingViewHolder(binding) - } - - override fun onBindViewHolder(holder: DataBindingViewHolder, position: Int) { - viewBindViewHolder(holder, position) - holder.bind(getItem(position)) - } - - protected open fun viewBindViewHolder(holder: DataBindingViewHolder, position: Int) {} -} diff --git a/examples/st-device-app/android/App/feature/main/src/main/res/values/strings.xml b/examples/st-device-app/android/App/feature/main/src/main/res/values/strings.xml deleted file mode 100644 index eced9a65286e1a..00000000000000 --- a/examples/st-device-app/android/App/feature/main/src/main/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - SmartThings Matter Device - \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/main/src/test/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleUnitTest.kt b/examples/st-device-app/android/App/feature/main/src/test/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleUnitTest.kt deleted file mode 100644 index 2f5c36ce14f472..00000000000000 --- a/examples/st-device-app/android/App/feature/main/src/test/java/com/samsung/matter/chipstdeviceapp/feature/main/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.feature.main - -import org.junit.Assert.* -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} diff --git a/examples/st-device-app/android/App/feature/qrcode/consumer-rules.pro b/examples/st-device-app/android/App/feature/qrcode/consumer-rules.pro deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/examples/st-device-app/android/App/feature/qrcode/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/feature/qrcode/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleInstrumentedTest.kt deleted file mode 100644 index 8881d4688b942b..00000000000000 --- a/examples/st-device-app/android/App/feature/qrcode/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.feature.qrcode - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.* -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.feature.qrcode.test", appContext.packageName) - } -} diff --git a/examples/st-device-app/android/App/feature/qrcode/src/test/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleUnitTest.kt b/examples/st-device-app/android/App/feature/qrcode/src/test/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleUnitTest.kt deleted file mode 100644 index e93b1b7bdeceef..00000000000000 --- a/examples/st-device-app/android/App/feature/qrcode/src/test/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.feature.qrcode - -import org.junit.Assert.* -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} diff --git a/examples/st-device-app/android/App/feature/setup/consumer-rules.pro b/examples/st-device-app/android/App/feature/setup/consumer-rules.pro deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/examples/st-device-app/android/App/feature/setup/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleInstrumentedTest.kt b/examples/st-device-app/android/App/feature/setup/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleInstrumentedTest.kt deleted file mode 100644 index 5a0e773564ee8b..00000000000000 --- a/examples/st-device-app/android/App/feature/setup/src/androidTest/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.feature.setup - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.* -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.feature.setup.test", appContext.packageName) - } -} diff --git a/examples/st-device-app/android/App/feature/setup/src/test/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleUnitTest.kt b/examples/st-device-app/android/App/feature/setup/src/test/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleUnitTest.kt deleted file mode 100644 index b8e0584ad1cbc2..00000000000000 --- a/examples/st-device-app/android/App/feature/setup/src/test/java/com/samsung/matter/chipstdeviceapp/feature/setup/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.samsung.matter.chipstdeviceapp.feature.setup - -import org.junit.Assert.* -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} diff --git a/examples/st-device-app/android/.gn b/examples/virtual-device-app/android/.gn similarity index 94% rename from examples/st-device-app/android/.gn rename to examples/virtual-device-app/android/.gn index 3bd513ec621bfb..747b125d35d3c2 100644 --- a/examples/st-device-app/android/.gn +++ b/examples/virtual-device-app/android/.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2020-2023 Project CHIP Authors +# Copyright (c) 2023 Project CHIP Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/examples/st-device-app/android/App/.gitignore b/examples/virtual-device-app/android/App/.gitignore similarity index 100% rename from examples/st-device-app/android/App/.gitignore rename to examples/virtual-device-app/android/App/.gitignore diff --git a/examples/st-device-app/android/App/app/.gitignore b/examples/virtual-device-app/android/App/app/.gitignore similarity index 100% rename from examples/st-device-app/android/App/app/.gitignore rename to examples/virtual-device-app/android/App/app/.gitignore diff --git a/examples/st-device-app/android/App/app/build.gradle.kts b/examples/virtual-device-app/android/App/app/build.gradle.kts similarity index 90% rename from examples/st-device-app/android/App/app/build.gradle.kts rename to examples/virtual-device-app/android/App/app/build.gradle.kts index f92023a82b9b66..3b139f2b61b6ad 100644 --- a/examples/st-device-app/android/App/app/build.gradle.kts +++ b/examples/virtual-device-app/android/App/app/build.gradle.kts @@ -1,5 +1,5 @@ -import com.samsung.buildsrc.Deps -import com.samsung.buildsrc.Versions +import com.matter.buildsrc.Deps +import com.matter.buildsrc.Versions plugins { id("com.android.application") @@ -10,12 +10,12 @@ plugins { } android { - namespace = "com.samsung.matter.chipstdeviceapp" + namespace = "com.matter.virtual.device.app" compileSdk = Versions.compileSdkVersion buildToolsVersion = Versions.buildToolsVersion defaultConfig { - applicationId = "com.samsung.matter.chipstdeviceapp" + applicationId = "com.matter.virtual.device.app" minSdk = Versions.minSdkVersion targetSdk = Versions.targetSdkVersion versionCode = 1 @@ -84,6 +84,9 @@ dependencies { implementation(Deps.AndroidX.appcompat) implementation(Deps.material) + implementation(Deps.Navigation.fragment) + implementation(Deps.Navigation.ui) + implementation(Deps.Dagger.hiltAndroid) kapt(Deps.Dagger.hiltAndroidCompiler) diff --git a/examples/st-device-app/android/App/app/proguard-rules.pro b/examples/virtual-device-app/android/App/app/proguard-rules.pro similarity index 100% rename from examples/st-device-app/android/App/app/proguard-rules.pro rename to examples/virtual-device-app/android/App/app/proguard-rules.pro diff --git a/examples/st-device-app/android/App/app/src/androidTest/java/com/samsung/matter/chipstdeviceapp/ExampleInstrumentedTest.kt b/examples/virtual-device-app/android/App/app/src/androidTest/java/com/matter/virtual/device/app/ExampleInstrumentedTest.kt similarity index 81% rename from examples/st-device-app/android/App/app/src/androidTest/java/com/samsung/matter/chipstdeviceapp/ExampleInstrumentedTest.kt rename to examples/virtual-device-app/android/App/app/src/androidTest/java/com/matter/virtual/device/app/ExampleInstrumentedTest.kt index 9dbf4b7fa841c4..09ae8b5b5a2b5b 100644 --- a/examples/st-device-app/android/App/app/src/androidTest/java/com/samsung/matter/chipstdeviceapp/ExampleInstrumentedTest.kt +++ b/examples/virtual-device-app/android/App/app/src/androidTest/java/com/matter/virtual/device/app/ExampleInstrumentedTest.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp +package com.matter.virtual.device.app import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry @@ -17,6 +17,6 @@ class ExampleInstrumentedTest { fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp", appContext.packageName) + assertEquals("com.matter.virtual.device.app", appContext.packageName) } } diff --git a/examples/st-device-app/android/App/app/src/main/AndroidManifest.xml b/examples/virtual-device-app/android/App/app/src/main/AndroidManifest.xml similarity index 88% rename from examples/st-device-app/android/App/app/src/main/AndroidManifest.xml rename to examples/virtual-device-app/android/App/app/src/main/AndroidManifest.xml index 0b737dc55c1502..a57ddde21a56eb 100644 --- a/examples/st-device-app/android/App/app/src/main/AndroidManifest.xml +++ b/examples/virtual-device-app/android/App/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ diff --git a/examples/st-device-app/android/App/app/src/main/ic_launcher-playstore.png b/examples/virtual-device-app/android/App/app/src/main/ic_launcher-playstore.png similarity index 100% rename from examples/st-device-app/android/App/app/src/main/ic_launcher-playstore.png rename to examples/virtual-device-app/android/App/app/src/main/ic_launcher-playstore.png diff --git a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/App.kt b/examples/virtual-device-app/android/App/app/src/main/java/com/matter/virtual/device/app/App.kt similarity index 84% rename from examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/App.kt rename to examples/virtual-device-app/android/App/app/src/main/java/com/matter/virtual/device/app/App.kt index d97343892648ff..16b1731fb941da 100644 --- a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/App.kt +++ b/examples/virtual-device-app/android/App/app/src/main/java/com/matter/virtual/device/app/App.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp +package com.matter.virtual.device.app import android.app.Application import dagger.hilt.android.HiltAndroidApp diff --git a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/MainActivity.kt b/examples/virtual-device-app/android/App/app/src/main/java/com/matter/virtual/device/app/MainActivity.kt similarity index 93% rename from examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/MainActivity.kt rename to examples/virtual-device-app/android/App/app/src/main/java/com/matter/virtual/device/app/MainActivity.kt index a525b2129e8bdd..94bfa6e97b8206 100644 --- a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/MainActivity.kt +++ b/examples/virtual-device-app/android/App/app/src/main/java/com/matter/virtual/device/app/MainActivity.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp +package com.matter.virtual.device.app import android.Manifest import android.content.pm.PackageManager @@ -7,7 +7,7 @@ import android.view.MenuItem import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat -import com.samsung.matter.chipstdeviceapp.databinding.ActivityMainBinding +import com.matter.virtual.device.app.databinding.ActivityMainBinding import dagger.hilt.android.AndroidEntryPoint import timber.log.Timber diff --git a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/TimberDebugTree.kt b/examples/virtual-device-app/android/App/app/src/main/java/com/matter/virtual/device/app/TimberDebugTree.kt similarity index 88% rename from examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/TimberDebugTree.kt rename to examples/virtual-device-app/android/App/app/src/main/java/com/matter/virtual/device/app/TimberDebugTree.kt index 776f147aef6890..a317af1372ed99 100644 --- a/examples/st-device-app/android/App/app/src/main/java/com/samsung/matter/chipstdeviceapp/TimberDebugTree.kt +++ b/examples/virtual-device-app/android/App/app/src/main/java/com/matter/virtual/device/app/TimberDebugTree.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp +package com.matter.virtual.device.app import timber.log.Timber diff --git a/examples/st-device-app/android/App/app/src/main/res/drawable/ic_launcher_background.xml b/examples/virtual-device-app/android/App/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/drawable/ic_launcher_background.xml rename to examples/virtual-device-app/android/App/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/examples/st-device-app/android/App/app/src/main/res/drawable/ic_launcher_foreground.xml b/examples/virtual-device-app/android/App/app/src/main/res/drawable/ic_launcher_foreground.xml similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/drawable/ic_launcher_foreground.xml rename to examples/virtual-device-app/android/App/app/src/main/res/drawable/ic_launcher_foreground.xml diff --git a/examples/st-device-app/android/App/app/src/main/res/layout/activity_main.xml b/examples/virtual-device-app/android/App/app/src/main/res/layout/activity_main.xml similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/layout/activity_main.xml rename to examples/virtual-device-app/android/App/app/src/main/res/layout/activity_main.xml diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/examples/virtual-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to examples/virtual-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/examples/virtual-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to examples/virtual-device-app/android/App/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/virtual-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to examples/virtual-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/examples/virtual-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to examples/virtual-device-app/android/App/app/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/virtual-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to examples/virtual-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/examples/virtual-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to examples/virtual-device-app/android/App/app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/virtual-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to examples/virtual-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/examples/virtual-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to examples/virtual-device-app/android/App/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/examples/st-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to examples/virtual-device-app/android/App/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/examples/st-device-app/android/App/app/src/main/res/navigation/nav_graph.xml b/examples/virtual-device-app/android/App/app/src/main/res/navigation/nav_graph.xml similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/navigation/nav_graph.xml rename to examples/virtual-device-app/android/App/app/src/main/res/navigation/nav_graph.xml diff --git a/examples/st-device-app/android/App/app/src/main/res/values-night/colors.xml b/examples/virtual-device-app/android/App/app/src/main/res/values-night/colors.xml similarity index 100% rename from examples/st-device-app/android/App/app/src/main/res/values-night/colors.xml rename to examples/virtual-device-app/android/App/app/src/main/res/values-night/colors.xml diff --git a/examples/virtual-device-app/android/App/app/src/main/res/values/strings.xml b/examples/virtual-device-app/android/App/app/src/main/res/values/strings.xml new file mode 100644 index 00000000000000..8194edb5a4edd8 --- /dev/null +++ b/examples/virtual-device-app/android/App/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Matter Virtual Device + diff --git a/examples/st-device-app/android/App/app/src/test/java/com/samsung/matter/chipstdeviceapp/ExampleUnitTest.kt b/examples/virtual-device-app/android/App/app/src/test/java/com/matter/virtual/device/app/ExampleUnitTest.kt similarity index 87% rename from examples/st-device-app/android/App/app/src/test/java/com/samsung/matter/chipstdeviceapp/ExampleUnitTest.kt rename to examples/virtual-device-app/android/App/app/src/test/java/com/matter/virtual/device/app/ExampleUnitTest.kt index 14085283253908..8de371c92f9f9b 100644 --- a/examples/st-device-app/android/App/app/src/test/java/com/samsung/matter/chipstdeviceapp/ExampleUnitTest.kt +++ b/examples/virtual-device-app/android/App/app/src/test/java/com/matter/virtual/device/app/ExampleUnitTest.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp +package com.matter.virtual.device.app import org.junit.Assert.* import org.junit.Test diff --git a/examples/st-device-app/android/App/build.gradle.kts b/examples/virtual-device-app/android/App/build.gradle.kts similarity index 100% rename from examples/st-device-app/android/App/build.gradle.kts rename to examples/virtual-device-app/android/App/build.gradle.kts diff --git a/examples/st-device-app/android/App/buildSrc/.gitignore b/examples/virtual-device-app/android/App/buildSrc/.gitignore similarity index 100% rename from examples/st-device-app/android/App/buildSrc/.gitignore rename to examples/virtual-device-app/android/App/buildSrc/.gitignore diff --git a/examples/st-device-app/android/App/buildSrc/build.gradle.kts b/examples/virtual-device-app/android/App/buildSrc/build.gradle.kts similarity index 100% rename from examples/st-device-app/android/App/buildSrc/build.gradle.kts rename to examples/virtual-device-app/android/App/buildSrc/build.gradle.kts diff --git a/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Deps.kt b/examples/virtual-device-app/android/App/buildSrc/src/main/java/com/matter/buildsrc/Deps.kt similarity index 98% rename from examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Deps.kt rename to examples/virtual-device-app/android/App/buildSrc/src/main/java/com/matter/buildsrc/Deps.kt index 9613cd91977c7a..2593dca0ee3227 100644 --- a/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Deps.kt +++ b/examples/virtual-device-app/android/App/buildSrc/src/main/java/com/matter/buildsrc/Deps.kt @@ -1,4 +1,4 @@ -package com.samsung.buildsrc +package com.matter.buildsrc object Deps { object AndroidX { diff --git a/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Versions.kt b/examples/virtual-device-app/android/App/buildSrc/src/main/java/com/matter/buildsrc/Versions.kt similarity index 84% rename from examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Versions.kt rename to examples/virtual-device-app/android/App/buildSrc/src/main/java/com/matter/buildsrc/Versions.kt index 2e193790936bd5..543ed231e3709c 100644 --- a/examples/st-device-app/android/App/buildSrc/src/main/java/com/samsung/buildsrc/Versions.kt +++ b/examples/virtual-device-app/android/App/buildSrc/src/main/java/com/matter/buildsrc/Versions.kt @@ -1,4 +1,4 @@ -package com.samsung.buildsrc +package com.matter.buildsrc object Versions { const val compileSdkVersion = 33 diff --git a/examples/st-device-app/android/App/core/common/.gitignore b/examples/virtual-device-app/android/App/core/common/.gitignore similarity index 100% rename from examples/st-device-app/android/App/core/common/.gitignore rename to examples/virtual-device-app/android/App/core/common/.gitignore diff --git a/examples/st-device-app/android/App/core/common/build.gradle.kts b/examples/virtual-device-app/android/App/core/common/build.gradle.kts similarity index 91% rename from examples/st-device-app/android/App/core/common/build.gradle.kts rename to examples/virtual-device-app/android/App/core/common/build.gradle.kts index a0a78fcc24df9a..d424108ab919de 100644 --- a/examples/st-device-app/android/App/core/common/build.gradle.kts +++ b/examples/virtual-device-app/android/App/core/common/build.gradle.kts @@ -1,5 +1,5 @@ -import com.samsung.buildsrc.Deps -import com.samsung.buildsrc.Versions +import com.matter.buildsrc.Deps +import com.matter.buildsrc.Versions plugins { id("com.android.library") @@ -10,7 +10,7 @@ plugins { } android { - namespace = "com.samsung.matter.chipstdeviceapp.core.common" + namespace = "com.matter.virtual.device.app.core.common" compileSdk = Versions.compileSdkVersion defaultConfig { diff --git a/examples/st-device-app/android/App/core/common/proguard-rules.pro b/examples/virtual-device-app/android/App/core/common/proguard-rules.pro similarity index 100% rename from examples/st-device-app/android/App/core/common/proguard-rules.pro rename to examples/virtual-device-app/android/App/core/common/proguard-rules.pro diff --git a/examples/st-device-app/android/App/core/model/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleInstrumentedTest.kt b/examples/virtual-device-app/android/App/core/common/src/androidTest/java/com/matter/virtual/device/app/core/common/ExampleInstrumentedTest.kt similarity index 78% rename from examples/st-device-app/android/App/core/model/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleInstrumentedTest.kt rename to examples/virtual-device-app/android/App/core/common/src/androidTest/java/com/matter/virtual/device/app/core/common/ExampleInstrumentedTest.kt index d1aae5ddc6f8be..54876ab392e911 100644 --- a/examples/st-device-app/android/App/core/model/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleInstrumentedTest.kt +++ b/examples/virtual-device-app/android/App/core/common/src/androidTest/java/com/matter/virtual/device/app/core/common/ExampleInstrumentedTest.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.model +package com.matter.virtual.device.app.core.common import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry @@ -17,6 +17,6 @@ class ExampleInstrumentedTest { fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.core.model.test", appContext.packageName) + assertEquals("com.matter.virtual.device.app.core.common.test", appContext.packageName) } } diff --git a/examples/st-device-app/android/App/core/common/src/main/AndroidManifest.xml b/examples/virtual-device-app/android/App/core/common/src/main/AndroidManifest.xml similarity index 100% rename from examples/st-device-app/android/App/core/common/src/main/AndroidManifest.xml rename to examples/virtual-device-app/android/App/core/common/src/main/AndroidManifest.xml diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/DeepLink.kt b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/DeepLink.kt similarity index 61% rename from examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/DeepLink.kt rename to examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/DeepLink.kt index 2b4da93cec833f..1a84f4a6840cd2 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/DeepLink.kt +++ b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/DeepLink.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.common +package com.matter.virtual.device.app.core.common import androidx.core.net.toUri import androidx.navigation.NavDeepLinkRequest @@ -6,7 +6,7 @@ import androidx.navigation.NavDeepLinkRequest object DeepLink { fun getDeepLinkRequestForQrcodeFragment(setting: String): NavDeepLinkRequest { return NavDeepLinkRequest.Builder.fromUri( - "android-app://com.samsung.matter.chipstdeviceapp.feature.qrcode/qrcodeFragment/${setting}" + "android-app://com.matter.virtual.device.app.feature.qrcode/qrcodeFragment/${setting}" .toUri() ) .build() @@ -14,8 +14,7 @@ object DeepLink { fun getDeepLinkRequestForSetupFragment(setting: String): NavDeepLinkRequest { return NavDeepLinkRequest.Builder.fromUri( - "android-app://com.samsung.matter.chipstdeviceapp.feature.setup/setupFragment/${setting}" - .toUri() + "android-app://com.matter.virtual.device.app.feature.setup/setupFragment/${setting}".toUri() ) .build() } diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Device.kt b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/Device.kt similarity index 72% rename from examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Device.kt rename to examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/Device.kt index d7897ed62784dc..067898bbd79d93 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Device.kt +++ b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/Device.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.common +package com.matter.virtual.device.app.core.common import androidx.annotation.DrawableRes import androidx.annotation.StringRes @@ -7,7 +7,6 @@ import kotlinx.serialization.Serializable @Serializable sealed class Device( val title: String, - val productId: Long, @StringRes val deviceNameResId: Int, @DrawableRes val deviceIconResId: Int, val deviceTypeId: Long, @@ -17,8 +16,7 @@ sealed class Device( object OnOffSwitch : Device( "onoffswitch", - 0x1001, - R.string.samsung_on_off_switch, + R.string.matter_on_off_switch, R.drawable.round_toggle_on_24, 0x0103, 3841 @@ -26,14 +24,7 @@ sealed class Device( @Serializable object Unknown : - Device( - "unknown", - 0xFFFF, - R.string.matter_device, - R.drawable.round_device_unknown_24, - 65535, - 3840 - ) + Device("unknown", R.string.matter_device, R.drawable.round_device_unknown_24, 65535, 3840) companion object { fun map(title: String): Device { diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterConstants.kt b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/MatterConstants.kt similarity index 64% rename from examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterConstants.kt rename to examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/MatterConstants.kt index d3b85c81bd94d3..84f26bfca81b68 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterConstants.kt +++ b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/MatterConstants.kt @@ -1,9 +1,9 @@ -package com.samsung.matter.chipstdeviceapp.core.common +package com.matter.virtual.device.app.core.common object MatterConstants { const val DEFAULT_VERSION = 0 - const val DEFAULT_VENDOR_ID = 0x10E1 - const val DEFAULT_PRODUCT_ID = 0x1001 + const val DEFAULT_VENDOR_ID = 0xFFF1 + const val DEFAULT_PRODUCT_ID = 0x8001 const val DEFAULT_COMMISSIONING_FLOW = 0 const val DEFAULT_SETUP_PINCODE = 20202021L const val DEFAULT_DISCRIMINATOR = 3840 diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterSettings.kt b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/MatterSettings.kt similarity index 67% rename from examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterSettings.kt rename to examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/MatterSettings.kt index fc1371c1636dcf..dfa2f9e7542a51 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/MatterSettings.kt +++ b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/MatterSettings.kt @@ -1,6 +1,6 @@ -package com.samsung.matter.chipstdeviceapp.core.common +package com.matter.virtual.device.app.core.common -import com.samsung.matter.chipstdeviceapp.core.model.OnboardingType +import com.matter.virtual.device.app.core.model.OnboardingType import kotlinx.serialization.Serializable @Serializable diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/QrcodeUtil.kt b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/QrcodeUtil.kt similarity index 93% rename from examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/QrcodeUtil.kt rename to examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/QrcodeUtil.kt index 82c6869a36ca0e..35f82d94c5c9a8 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/QrcodeUtil.kt +++ b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/QrcodeUtil.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.common +package com.matter.virtual.device.app.core.common import android.graphics.Bitmap import android.graphics.Color diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Result.kt b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/Result.kt similarity index 88% rename from examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Result.kt rename to examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/Result.kt index ded10cab7a4196..02330400bebc5b 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/Result.kt +++ b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/Result.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.common +package com.matter.virtual.device.app.core.common sealed class Result { diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesModule.kt b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/di/CoroutinesModule.kt similarity index 93% rename from examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesModule.kt rename to examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/di/CoroutinesModule.kt index a6ac2ee76db81f..ec4974e0c5646f 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesModule.kt +++ b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/di/CoroutinesModule.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.common.di +package com.matter.virtual.device.app.core.common.di import dagger.Module import dagger.Provides diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesQualifiers.kt b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/di/CoroutinesQualifiers.kt similarity index 86% rename from examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesQualifiers.kt rename to examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/di/CoroutinesQualifiers.kt index b1baa62cd20b0b..ac55fb68756e17 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/di/CoroutinesQualifiers.kt +++ b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/di/CoroutinesQualifiers.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.common.di +package com.matter.virtual.device.app.core.common.di import javax.inject.Qualifier diff --git a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/ui/DisableAppBarLayoutBehavior.kt b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/ui/DisableAppBarLayoutBehavior.kt similarity index 92% rename from examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/ui/DisableAppBarLayoutBehavior.kt rename to examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/ui/DisableAppBarLayoutBehavior.kt index b302b0dd002d42..929306fbdc92f8 100644 --- a/examples/st-device-app/android/App/core/common/src/main/java/com/samsung/matter/chipstdeviceapp/core/common/ui/DisableAppBarLayoutBehavior.kt +++ b/examples/virtual-device-app/android/App/core/common/src/main/java/com/matter/virtual/device/app/core/common/ui/DisableAppBarLayoutBehavior.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.common.ui +package com.matter.virtual.device.app.core.common.ui import android.content.Context import android.util.AttributeSet diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable/menu_item_bg.xml b/examples/virtual-device-app/android/App/core/common/src/main/res/drawable/menu_item_bg.xml similarity index 100% rename from examples/st-device-app/android/App/core/common/src/main/res/drawable/menu_item_bg.xml rename to examples/virtual-device-app/android/App/core/common/src/main/res/drawable/menu_item_bg.xml diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable/round_device_unknown_24.xml b/examples/virtual-device-app/android/App/core/common/src/main/res/drawable/round_device_unknown_24.xml similarity index 100% rename from examples/st-device-app/android/App/core/common/src/main/res/drawable/round_device_unknown_24.xml rename to examples/virtual-device-app/android/App/core/common/src/main/res/drawable/round_device_unknown_24.xml diff --git a/examples/st-device-app/android/App/core/common/src/main/res/drawable/round_toggle_on_24.xml b/examples/virtual-device-app/android/App/core/common/src/main/res/drawable/round_toggle_on_24.xml similarity index 100% rename from examples/st-device-app/android/App/core/common/src/main/res/drawable/round_toggle_on_24.xml rename to examples/virtual-device-app/android/App/core/common/src/main/res/drawable/round_toggle_on_24.xml diff --git a/examples/st-device-app/android/App/core/common/src/main/res/values-night/colors.xml b/examples/virtual-device-app/android/App/core/common/src/main/res/values-night/colors.xml similarity index 100% rename from examples/st-device-app/android/App/core/common/src/main/res/values-night/colors.xml rename to examples/virtual-device-app/android/App/core/common/src/main/res/values-night/colors.xml diff --git a/examples/st-device-app/android/App/core/common/src/main/res/values/colors.xml b/examples/virtual-device-app/android/App/core/common/src/main/res/values/colors.xml similarity index 100% rename from examples/st-device-app/android/App/core/common/src/main/res/values/colors.xml rename to examples/virtual-device-app/android/App/core/common/src/main/res/values/colors.xml diff --git a/examples/st-device-app/android/App/core/common/src/main/res/values/dimens.xml b/examples/virtual-device-app/android/App/core/common/src/main/res/values/dimens.xml similarity index 100% rename from examples/st-device-app/android/App/core/common/src/main/res/values/dimens.xml rename to examples/virtual-device-app/android/App/core/common/src/main/res/values/dimens.xml diff --git a/examples/st-device-app/android/App/core/common/src/main/res/values/strings.xml b/examples/virtual-device-app/android/App/core/common/src/main/res/values/strings.xml similarity index 69% rename from examples/st-device-app/android/App/core/common/src/main/res/values/strings.xml rename to examples/virtual-device-app/android/App/core/common/src/main/res/values/strings.xml index 461c15d30ffafd..7afe5953bf2dfd 100644 --- a/examples/st-device-app/android/App/core/common/src/main/res/values/strings.xml +++ b/examples/virtual-device-app/android/App/core/common/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ - Samsung OnOff Switch + Matter OnOff Switch Matter Device icon \ No newline at end of file diff --git a/examples/st-device-app/android/App/core/common/src/main/res/values/themes.xml b/examples/virtual-device-app/android/App/core/common/src/main/res/values/themes.xml similarity index 100% rename from examples/st-device-app/android/App/core/common/src/main/res/values/themes.xml rename to examples/virtual-device-app/android/App/core/common/src/main/res/values/themes.xml diff --git a/examples/st-device-app/android/App/core/data/src/test/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleUnitTest.kt b/examples/virtual-device-app/android/App/core/common/src/test/java/com/matter/virtual/device/app/core/common/ExampleUnitTest.kt similarity index 85% rename from examples/st-device-app/android/App/core/data/src/test/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleUnitTest.kt rename to examples/virtual-device-app/android/App/core/common/src/test/java/com/matter/virtual/device/app/core/common/ExampleUnitTest.kt index 17f5d89996f536..6df49ef5a27e1a 100644 --- a/examples/st-device-app/android/App/core/data/src/test/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleUnitTest.kt +++ b/examples/virtual-device-app/android/App/core/common/src/test/java/com/matter/virtual/device/app/core/common/ExampleUnitTest.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.data +package com.matter.virtual.device.app.core.common import org.junit.Assert.* import org.junit.Test diff --git a/examples/st-device-app/android/App/core/data/.gitignore b/examples/virtual-device-app/android/App/core/data/.gitignore similarity index 100% rename from examples/st-device-app/android/App/core/data/.gitignore rename to examples/virtual-device-app/android/App/core/data/.gitignore diff --git a/examples/st-device-app/android/App/core/data/build.gradle.kts b/examples/virtual-device-app/android/App/core/data/build.gradle.kts similarity index 90% rename from examples/st-device-app/android/App/core/data/build.gradle.kts rename to examples/virtual-device-app/android/App/core/data/build.gradle.kts index e269b0278c56ad..43027424737f65 100644 --- a/examples/st-device-app/android/App/core/data/build.gradle.kts +++ b/examples/virtual-device-app/android/App/core/data/build.gradle.kts @@ -1,5 +1,5 @@ -import com.samsung.buildsrc.Deps -import com.samsung.buildsrc.Versions +import com.matter.buildsrc.Deps +import com.matter.buildsrc.Versions plugins { id("com.android.library") @@ -9,7 +9,7 @@ plugins { } android { - namespace = "com.samsung.matter.chipstdeviceapp.core.data" + namespace = "com.matter.virtual.device.app.core.data" compileSdk = Versions.compileSdkVersion defaultConfig { diff --git a/examples/st-device-app/android/App/core/data/proguard-rules.pro b/examples/virtual-device-app/android/App/core/data/proguard-rules.pro similarity index 100% rename from examples/st-device-app/android/App/core/data/proguard-rules.pro rename to examples/virtual-device-app/android/App/core/data/proguard-rules.pro diff --git a/examples/st-device-app/android/App/core/domain/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleInstrumentedTest.kt b/examples/virtual-device-app/android/App/core/data/src/androidTest/java/com/matter/virtual/device/app/core/data/ExampleInstrumentedTest.kt similarity index 78% rename from examples/st-device-app/android/App/core/domain/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleInstrumentedTest.kt rename to examples/virtual-device-app/android/App/core/data/src/androidTest/java/com/matter/virtual/device/app/core/data/ExampleInstrumentedTest.kt index ccd4213230c502..26be07910d95f1 100644 --- a/examples/st-device-app/android/App/core/domain/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/domain/ExampleInstrumentedTest.kt +++ b/examples/virtual-device-app/android/App/core/data/src/androidTest/java/com/matter/virtual/device/app/core/data/ExampleInstrumentedTest.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.domain +package com.matter.virtual.device.app.core.data import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry @@ -17,6 +17,6 @@ class ExampleInstrumentedTest { fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.core.domain.test", appContext.packageName) + assertEquals("com.matter.virtual.device.app.core.data.test", appContext.packageName) } } diff --git a/examples/st-device-app/android/App/core/data/src/main/AndroidManifest.xml b/examples/virtual-device-app/android/App/core/data/src/main/AndroidManifest.xml similarity index 100% rename from examples/st-device-app/android/App/core/data/src/main/AndroidManifest.xml rename to examples/virtual-device-app/android/App/core/data/src/main/AndroidManifest.xml diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/di/DataModule.kt b/examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/di/DataModule.kt similarity index 52% rename from examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/di/DataModule.kt rename to examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/di/DataModule.kt index d1990b78336b75..c0352d531da3b5 100644 --- a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/di/DataModule.kt +++ b/examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/di/DataModule.kt @@ -1,6 +1,9 @@ -package com.samsung.matter.chipstdeviceapp.core.data.di +package com.matter.virtual.device.app.core.data.di -import com.samsung.matter.chipstdeviceapp.core.data.repository.* +import com.matter.virtual.device.app.core.data.repository.MatterRepository +import com.matter.virtual.device.app.core.data.repository.MatterRepositoryImpl +import com.matter.virtual.device.app.core.data.repository.NetworkRepository +import com.matter.virtual.device.app.core.data.repository.NetworkRepositoryImpl import dagger.Binds import dagger.Module import dagger.hilt.InstallIn diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepository.kt b/examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/repository/MatterRepository.kt similarity index 53% rename from examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepository.kt rename to examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/repository/MatterRepository.kt index 6e88011ed8b7af..7e436f8208276d 100644 --- a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepository.kt +++ b/examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/repository/MatterRepository.kt @@ -1,6 +1,6 @@ -package com.samsung.matter.chipstdeviceapp.core.data.repository +package com.matter.virtual.device.app.core.data.repository -import com.samsung.matter.chipstdeviceapp.core.model.Payload +import com.matter.virtual.device.app.core.model.Payload interface MatterRepository { fun getQrcodeString(payload: Payload): String diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepositoryImpl.kt b/examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/repository/MatterRepositoryImpl.kt similarity index 67% rename from examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepositoryImpl.kt rename to examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/repository/MatterRepositoryImpl.kt index 29c1825dc09ec3..dc6d1cfd73174a 100644 --- a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/MatterRepositoryImpl.kt +++ b/examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/repository/MatterRepositoryImpl.kt @@ -1,7 +1,7 @@ -package com.samsung.matter.chipstdeviceapp.core.data.repository +package com.matter.virtual.device.app.core.data.repository -import com.samsung.matter.chipstdeviceapp.core.matter.MatterApi -import com.samsung.matter.chipstdeviceapp.core.model.Payload +import com.matter.virtual.device.app.core.matter.MatterApi +import com.matter.virtual.device.app.core.model.Payload import javax.inject.Inject internal class MatterRepositoryImpl @Inject constructor(private val matterApi: MatterApi) : diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepository.kt b/examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/repository/NetworkRepository.kt similarity index 50% rename from examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepository.kt rename to examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/repository/NetworkRepository.kt index 1035a9fd474cc8..4ff1cd8bf84a33 100644 --- a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepository.kt +++ b/examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/repository/NetworkRepository.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.data.repository +package com.matter.virtual.device.app.core.data.repository interface NetworkRepository { suspend fun getSSID(): String diff --git a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepositoryImpl.kt b/examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/repository/NetworkRepositoryImpl.kt similarity index 93% rename from examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepositoryImpl.kt rename to examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/repository/NetworkRepositoryImpl.kt index 3f38d7710127a4..20395ad2b7a637 100644 --- a/examples/st-device-app/android/App/core/data/src/main/java/com/samsung/matter/chipstdeviceapp/core/data/repository/NetworkRepositoryImpl.kt +++ b/examples/virtual-device-app/android/App/core/data/src/main/java/com/matter/virtual/device/app/core/data/repository/NetworkRepositoryImpl.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.data.repository +package com.matter.virtual.device.app.core.data.repository import android.content.Context import android.net.wifi.SupplicantState diff --git a/examples/st-device-app/android/App/core/model/src/test/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleUnitTest.kt b/examples/virtual-device-app/android/App/core/data/src/test/java/com/matter/virtual/device/app/core/data/ExampleUnitTest.kt similarity index 84% rename from examples/st-device-app/android/App/core/model/src/test/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleUnitTest.kt rename to examples/virtual-device-app/android/App/core/data/src/test/java/com/matter/virtual/device/app/core/data/ExampleUnitTest.kt index be593fb882e063..ec5dd8e3957aa3 100644 --- a/examples/st-device-app/android/App/core/model/src/test/java/com/samsung/matter/chipstdeviceapp/core/model/ExampleUnitTest.kt +++ b/examples/virtual-device-app/android/App/core/data/src/test/java/com/matter/virtual/device/app/core/data/ExampleUnitTest.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.model +package com.matter.virtual.device.app.core.data import org.junit.Assert.* import org.junit.Test diff --git a/examples/st-device-app/android/App/core/domain/.gitignore b/examples/virtual-device-app/android/App/core/domain/.gitignore similarity index 100% rename from examples/st-device-app/android/App/core/domain/.gitignore rename to examples/virtual-device-app/android/App/core/domain/.gitignore diff --git a/examples/st-device-app/android/App/core/domain/build.gradle.kts b/examples/virtual-device-app/android/App/core/domain/build.gradle.kts similarity index 89% rename from examples/st-device-app/android/App/core/domain/build.gradle.kts rename to examples/virtual-device-app/android/App/core/domain/build.gradle.kts index 35327c0df691d4..6cc2a239897333 100644 --- a/examples/st-device-app/android/App/core/domain/build.gradle.kts +++ b/examples/virtual-device-app/android/App/core/domain/build.gradle.kts @@ -1,5 +1,5 @@ -import com.samsung.buildsrc.Deps -import com.samsung.buildsrc.Versions +import com.matter.buildsrc.Deps +import com.matter.buildsrc.Versions plugins { id("com.android.library") @@ -7,7 +7,7 @@ plugins { } android { - namespace = "com.samsung.matter.chipstdeviceapp.core.domain" + namespace = "com.matter.virtual.device.app.core.domain" compileSdk = Versions.compileSdkVersion defaultConfig { diff --git a/examples/st-device-app/android/App/core/domain/proguard-rules.pro b/examples/virtual-device-app/android/App/core/domain/proguard-rules.pro similarity index 100% rename from examples/st-device-app/android/App/core/domain/proguard-rules.pro rename to examples/virtual-device-app/android/App/core/domain/proguard-rules.pro diff --git a/examples/virtual-device-app/android/App/core/domain/src/androidTest/java/com/matter/virtual/device/app/core/domain/ExampleInstrumentedTest.kt b/examples/virtual-device-app/android/App/core/domain/src/androidTest/java/com/matter/virtual/device/app/core/domain/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..ee74e1189e90bd --- /dev/null +++ b/examples/virtual-device-app/android/App/core/domain/src/androidTest/java/com/matter/virtual/device/app/core/domain/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package com.matter.virtual.device.app.core.domain + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.matter.virtual.device.app.core.domain.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/core/domain/src/main/AndroidManifest.xml b/examples/virtual-device-app/android/App/core/domain/src/main/AndroidManifest.xml similarity index 100% rename from examples/st-device-app/android/App/core/domain/src/main/AndroidManifest.xml rename to examples/virtual-device-app/android/App/core/domain/src/main/AndroidManifest.xml diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/CoroutineUseCase.kt b/examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/CoroutineUseCase.kt similarity index 81% rename from examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/CoroutineUseCase.kt rename to examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/CoroutineUseCase.kt index f7a476754a5d4a..548bff027c5fe7 100644 --- a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/CoroutineUseCase.kt +++ b/examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/CoroutineUseCase.kt @@ -1,6 +1,6 @@ -package com.samsung.matter.chipstdeviceapp.core.domain +package com.matter.virtual.device.app.core.domain -import com.samsung.matter.chipstdeviceapp.core.common.Result +import com.matter.virtual.device.app.core.common.Result import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/NonParamCoroutineUseCase.kt b/examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/NonParamCoroutineUseCase.kt similarity index 80% rename from examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/NonParamCoroutineUseCase.kt rename to examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/NonParamCoroutineUseCase.kt index 19bbc11d023dd7..869b865b00a52d 100644 --- a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/NonParamCoroutineUseCase.kt +++ b/examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/NonParamCoroutineUseCase.kt @@ -1,6 +1,6 @@ -package com.samsung.matter.chipstdeviceapp.core.domain +package com.matter.virtual.device.app.core.domain -import com.samsung.matter.chipstdeviceapp.core.common.Result +import com.matter.virtual.device.app.core.common.Result import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt b/examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt similarity index 53% rename from examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt rename to examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt index fa70bcad79372c..4c75c7532696d7 100644 --- a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt +++ b/examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/usecase/matter/GetManualPairingCodeStringUseCase.kt @@ -1,9 +1,9 @@ -package com.samsung.matter.chipstdeviceapp.core.domain.usecase.matter +package com.matter.virtual.device.app.core.domain.usecase.matter -import com.samsung.matter.chipstdeviceapp.core.common.di.IoDispatcher -import com.samsung.matter.chipstdeviceapp.core.data.repository.MatterRepository -import com.samsung.matter.chipstdeviceapp.core.domain.CoroutineUseCase -import com.samsung.matter.chipstdeviceapp.core.model.Payload +import com.matter.virtual.device.app.core.common.di.IoDispatcher +import com.matter.virtual.device.app.core.data.repository.MatterRepository +import com.matter.virtual.device.app.core.domain.CoroutineUseCase +import com.matter.virtual.device.app.core.model.Payload import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetQrCodeStringUseCase.kt b/examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/usecase/matter/GetQrCodeStringUseCase.kt similarity index 52% rename from examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetQrCodeStringUseCase.kt rename to examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/usecase/matter/GetQrCodeStringUseCase.kt index 2f57140572f600..0e8a5e7f5772ce 100644 --- a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/matter/GetQrCodeStringUseCase.kt +++ b/examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/usecase/matter/GetQrCodeStringUseCase.kt @@ -1,9 +1,9 @@ -package com.samsung.matter.chipstdeviceapp.core.domain.usecase.matter +package com.matter.virtual.device.app.core.domain.usecase.matter -import com.samsung.matter.chipstdeviceapp.core.common.di.IoDispatcher -import com.samsung.matter.chipstdeviceapp.core.data.repository.MatterRepository -import com.samsung.matter.chipstdeviceapp.core.domain.CoroutineUseCase -import com.samsung.matter.chipstdeviceapp.core.model.Payload +import com.matter.virtual.device.app.core.common.di.IoDispatcher +import com.matter.virtual.device.app.core.data.repository.MatterRepository +import com.matter.virtual.device.app.core.domain.CoroutineUseCase +import com.matter.virtual.device.app.core.model.Payload import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher diff --git a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/network/GetSSIDUseCase.kt b/examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/usecase/network/GetSSIDUseCase.kt similarity index 54% rename from examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/network/GetSSIDUseCase.kt rename to examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/usecase/network/GetSSIDUseCase.kt index 66d1a81712b10c..43dfdabacb1363 100644 --- a/examples/st-device-app/android/App/core/domain/src/main/java/com/samsung/matter/chipstdeviceapp/core/domain/usecase/network/GetSSIDUseCase.kt +++ b/examples/virtual-device-app/android/App/core/domain/src/main/java/com/matter/virtual/device/app/core/domain/usecase/network/GetSSIDUseCase.kt @@ -1,8 +1,8 @@ -package com.samsung.matter.chipstdeviceapp.core.domain.usecase.network +package com.matter.virtual.device.app.core.domain.usecase.network -import com.samsung.matter.chipstdeviceapp.core.common.di.IoDispatcher -import com.samsung.matter.chipstdeviceapp.core.data.repository.NetworkRepository -import com.samsung.matter.chipstdeviceapp.core.domain.NonParamCoroutineUseCase +import com.matter.virtual.device.app.core.common.di.IoDispatcher +import com.matter.virtual.device.app.core.data.repository.NetworkRepository +import com.matter.virtual.device.app.core.domain.NonParamCoroutineUseCase import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher diff --git a/examples/st-device-app/android/App/core/common/src/test/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleUnitTest.kt b/examples/virtual-device-app/android/App/core/domain/src/test/java/com/matter/virtual/device/app/core/domain/ExampleUnitTest.kt similarity index 84% rename from examples/st-device-app/android/App/core/common/src/test/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleUnitTest.kt rename to examples/virtual-device-app/android/App/core/domain/src/test/java/com/matter/virtual/device/app/core/domain/ExampleUnitTest.kt index ae72dc6a3e6e01..97d7f5351868b1 100644 --- a/examples/st-device-app/android/App/core/common/src/test/java/com/samsung/matter/chipstdeviceapp/core/common/ExampleUnitTest.kt +++ b/examples/virtual-device-app/android/App/core/domain/src/test/java/com/matter/virtual/device/app/core/domain/ExampleUnitTest.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.common +package com.matter.virtual.device.app.core.domain import org.junit.Assert.* import org.junit.Test diff --git a/examples/st-device-app/android/App/core/matter/.gitignore b/examples/virtual-device-app/android/App/core/matter/.gitignore similarity index 100% rename from examples/st-device-app/android/App/core/matter/.gitignore rename to examples/virtual-device-app/android/App/core/matter/.gitignore diff --git a/examples/st-device-app/android/App/core/matter/build.gradle.kts b/examples/virtual-device-app/android/App/core/matter/build.gradle.kts similarity index 91% rename from examples/st-device-app/android/App/core/matter/build.gradle.kts rename to examples/virtual-device-app/android/App/core/matter/build.gradle.kts index 82b01f4f10bcc0..9f94201ac02cf8 100644 --- a/examples/st-device-app/android/App/core/matter/build.gradle.kts +++ b/examples/virtual-device-app/android/App/core/matter/build.gradle.kts @@ -1,5 +1,5 @@ -import com.samsung.buildsrc.Deps -import com.samsung.buildsrc.Versions +import com.matter.buildsrc.Deps +import com.matter.buildsrc.Versions plugins { id("com.android.library") @@ -9,7 +9,7 @@ plugins { } android { - namespace = "com.samsung.matter.chipstdeviceapp.core.matter" + namespace = "com.matter.virtual.device.app.core.matter" compileSdk = Versions.compileSdkVersion defaultConfig { diff --git a/examples/st-device-app/android/App/core/matter/proguard-rules.pro b/examples/virtual-device-app/android/App/core/matter/proguard-rules.pro similarity index 100% rename from examples/st-device-app/android/App/core/matter/proguard-rules.pro rename to examples/virtual-device-app/android/App/core/matter/proguard-rules.pro diff --git a/examples/virtual-device-app/android/App/core/matter/src/androidTest/java/com/matter/virtual/device/app/core/matter/ExampleInstrumentedTest.kt b/examples/virtual-device-app/android/App/core/matter/src/androidTest/java/com/matter/virtual/device/app/core/matter/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..1aa22f0498dde6 --- /dev/null +++ b/examples/virtual-device-app/android/App/core/matter/src/androidTest/java/com/matter/virtual/device/app/core/matter/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package com.matter.virtual.device.app.core.matter + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.matter.virtual.device.app.core.matter.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/core/matter/src/main/AndroidManifest.xml b/examples/virtual-device-app/android/App/core/matter/src/main/AndroidManifest.xml similarity index 100% rename from examples/st-device-app/android/App/core/matter/src/main/AndroidManifest.xml rename to examples/virtual-device-app/android/App/core/matter/src/main/AndroidManifest.xml diff --git a/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/MatterApi.kt b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterApi.kt similarity index 84% rename from examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/MatterApi.kt rename to examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterApi.kt index 17db4fb6d96585..16974b4e307b49 100644 --- a/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/MatterApi.kt +++ b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterApi.kt @@ -1,9 +1,9 @@ -package com.samsung.matter.chipstdeviceapp.core.matter +package com.matter.virtual.device.app.core.matter import chip.onboardingpayload.OnboardingPayloadException import chip.onboardingpayload.OnboardingPayloadParser -import com.samsung.matter.chipstdeviceapp.core.matter.model.asSetupPayload -import com.samsung.matter.chipstdeviceapp.core.model.Payload +import com.matter.virtual.device.app.core.matter.model.asSetupPayload +import com.matter.virtual.device.app.core.model.Payload import javax.inject.Inject import javax.inject.Singleton import timber.log.Timber diff --git a/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/model/Payload.kt b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/model/Payload.kt similarity index 76% rename from examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/model/Payload.kt rename to examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/model/Payload.kt index a3250c80898572..076fd5c7e86815 100644 --- a/examples/st-device-app/android/App/core/matter/src/main/java/com/samsung/matter/chipstdeviceapp/core/matter/model/Payload.kt +++ b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/model/Payload.kt @@ -1,10 +1,10 @@ -package com.samsung.matter.chipstdeviceapp.core.matter.model +package com.matter.virtual.device.app.core.matter.model import chip.onboardingpayload.DiscoveryCapability import chip.onboardingpayload.OnboardingPayload -import com.samsung.matter.chipstdeviceapp.core.common.MatterConstants -import com.samsung.matter.chipstdeviceapp.core.model.OnboardingType -import com.samsung.matter.chipstdeviceapp.core.model.Payload +import com.matter.virtual.device.app.core.common.MatterConstants +import com.matter.virtual.device.app.core.model.OnboardingType +import com.matter.virtual.device.app.core.model.Payload import timber.log.Timber fun Payload.asSetupPayload(): OnboardingPayload { @@ -24,7 +24,7 @@ fun Payload.asSetupPayload(): OnboardingPayload { return OnboardingPayload( MatterConstants.DEFAULT_VERSION, MatterConstants.DEFAULT_VENDOR_ID, - productId, + MatterConstants.DEFAULT_PRODUCT_ID, MatterConstants.DEFAULT_COMMISSIONING_FLOW, discoveryCapabilities, discriminator, diff --git a/examples/virtual-device-app/android/App/core/matter/src/test/java/com/matter/virtual/device/app/core/matter/ExampleUnitTest.kt b/examples/virtual-device-app/android/App/core/matter/src/test/java/com/matter/virtual/device/app/core/matter/ExampleUnitTest.kt new file mode 100644 index 00000000000000..c355211d3b59db --- /dev/null +++ b/examples/virtual-device-app/android/App/core/matter/src/test/java/com/matter/virtual/device/app/core/matter/ExampleUnitTest.kt @@ -0,0 +1,16 @@ +package com.matter.virtual.device.app.core.matter + +import org.junit.Assert.* +import org.junit.Test + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/core/model/.gitignore b/examples/virtual-device-app/android/App/core/model/.gitignore similarity index 100% rename from examples/st-device-app/android/App/core/model/.gitignore rename to examples/virtual-device-app/android/App/core/model/.gitignore diff --git a/examples/st-device-app/android/App/core/model/build.gradle.kts b/examples/virtual-device-app/android/App/core/model/build.gradle.kts similarity index 87% rename from examples/st-device-app/android/App/core/model/build.gradle.kts rename to examples/virtual-device-app/android/App/core/model/build.gradle.kts index 0988bdf343526a..d51ec3d4154ea2 100644 --- a/examples/st-device-app/android/App/core/model/build.gradle.kts +++ b/examples/virtual-device-app/android/App/core/model/build.gradle.kts @@ -1,5 +1,5 @@ -import com.samsung.buildsrc.Deps -import com.samsung.buildsrc.Versions +import com.matter.buildsrc.Deps +import com.matter.buildsrc.Versions plugins { id("com.android.library") @@ -7,7 +7,7 @@ plugins { } android { - namespace = "com.samsung.matter.chipstdeviceapp.core.model" + namespace = "com.matter.virtual.device.app.core.model" compileSdk = Versions.compileSdkVersion defaultConfig { diff --git a/examples/st-device-app/android/App/core/model/proguard-rules.pro b/examples/virtual-device-app/android/App/core/model/proguard-rules.pro similarity index 100% rename from examples/st-device-app/android/App/core/model/proguard-rules.pro rename to examples/virtual-device-app/android/App/core/model/proguard-rules.pro diff --git a/examples/virtual-device-app/android/App/core/model/src/androidTest/java/com/matter/virtual/device/app/core/model/ExampleInstrumentedTest.kt b/examples/virtual-device-app/android/App/core/model/src/androidTest/java/com/matter/virtual/device/app/core/model/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..ce8f30dded727c --- /dev/null +++ b/examples/virtual-device-app/android/App/core/model/src/androidTest/java/com/matter/virtual/device/app/core/model/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package com.matter.virtual.device.app.core.model + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.matter.virtual.device.app.core.model.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/core/model/src/main/AndroidManifest.xml b/examples/virtual-device-app/android/App/core/model/src/main/AndroidManifest.xml similarity index 100% rename from examples/st-device-app/android/App/core/model/src/main/AndroidManifest.xml rename to examples/virtual-device-app/android/App/core/model/src/main/AndroidManifest.xml diff --git a/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/OnobardingType.kt b/examples/virtual-device-app/android/App/core/model/src/main/java/com/matter/virtual/device/app/core/model/OnobardingType.kt similarity index 81% rename from examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/OnobardingType.kt rename to examples/virtual-device-app/android/App/core/model/src/main/java/com/matter/virtual/device/app/core/model/OnobardingType.kt index 6da33d51698da0..46ce38113a5b5b 100644 --- a/examples/st-device-app/android/App/core/model/src/main/java/com/samsung/matter/chipstdeviceapp/core/model/OnobardingType.kt +++ b/examples/virtual-device-app/android/App/core/model/src/main/java/com/matter/virtual/device/app/core/model/OnobardingType.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.model +package com.matter.virtual.device.app.core.model enum class OnboardingType { WIFI, diff --git a/examples/virtual-device-app/android/App/core/model/src/main/java/com/matter/virtual/device/app/core/model/Payload.kt b/examples/virtual-device-app/android/App/core/model/src/main/java/com/matter/virtual/device/app/core/model/Payload.kt new file mode 100644 index 00000000000000..4ffc70768e31d1 --- /dev/null +++ b/examples/virtual-device-app/android/App/core/model/src/main/java/com/matter/virtual/device/app/core/model/Payload.kt @@ -0,0 +1,3 @@ +package com.matter.virtual.device.app.core.model + +data class Payload(val onboardingType: OnboardingType, val discriminator: Int) diff --git a/examples/virtual-device-app/android/App/core/model/src/test/java/com/matter/virtual/device/app/core/model/ExampleUnitTest.kt b/examples/virtual-device-app/android/App/core/model/src/test/java/com/matter/virtual/device/app/core/model/ExampleUnitTest.kt new file mode 100644 index 00000000000000..59f3546d111ca4 --- /dev/null +++ b/examples/virtual-device-app/android/App/core/model/src/test/java/com/matter/virtual/device/app/core/model/ExampleUnitTest.kt @@ -0,0 +1,16 @@ +package com.matter.virtual.device.app.core.model + +import org.junit.Assert.* +import org.junit.Test + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/feature/main/.gitignore b/examples/virtual-device-app/android/App/feature/main/.gitignore similarity index 100% rename from examples/st-device-app/android/App/feature/main/.gitignore rename to examples/virtual-device-app/android/App/feature/main/.gitignore diff --git a/examples/st-device-app/android/App/feature/main/build.gradle.kts b/examples/virtual-device-app/android/App/feature/main/build.gradle.kts similarity index 92% rename from examples/st-device-app/android/App/feature/main/build.gradle.kts rename to examples/virtual-device-app/android/App/feature/main/build.gradle.kts index 83006ab81d2c2b..c9931cf58938e4 100644 --- a/examples/st-device-app/android/App/feature/main/build.gradle.kts +++ b/examples/virtual-device-app/android/App/feature/main/build.gradle.kts @@ -1,5 +1,5 @@ -import com.samsung.buildsrc.Deps -import com.samsung.buildsrc.Versions +import com.matter.buildsrc.Deps +import com.matter.buildsrc.Versions plugins { id("com.android.library") @@ -10,7 +10,7 @@ plugins { } android { - namespace = "com.samsung.matter.chipstdeviceapp.feature.main" + namespace = "com.matter.virtual.device.app.feature.main" compileSdk = Versions.compileSdkVersion defaultConfig { diff --git a/examples/st-device-app/android/App/feature/main/proguard-rules.pro b/examples/virtual-device-app/android/App/feature/main/proguard-rules.pro similarity index 100% rename from examples/st-device-app/android/App/feature/main/proguard-rules.pro rename to examples/virtual-device-app/android/App/feature/main/proguard-rules.pro diff --git a/examples/virtual-device-app/android/App/feature/main/src/androidTest/java/com/matter/virtual/device/app/feature/main/ExampleInstrumentedTest.kt b/examples/virtual-device-app/android/App/feature/main/src/androidTest/java/com/matter/virtual/device/app/feature/main/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..b1b135167ba95d --- /dev/null +++ b/examples/virtual-device-app/android/App/feature/main/src/androidTest/java/com/matter/virtual/device/app/feature/main/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package com.matter.virtual.device.app.feature.main + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.matter.virtual.device.app.feature.main.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/feature/main/src/main/AndroidManifest.xml b/examples/virtual-device-app/android/App/feature/main/src/main/AndroidManifest.xml similarity index 100% rename from examples/st-device-app/android/App/feature/main/src/main/AndroidManifest.xml rename to examples/virtual-device-app/android/App/feature/main/src/main/AndroidManifest.xml diff --git a/examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/BindingAdapter.kt b/examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/BindingAdapter.kt new file mode 100644 index 00000000000000..771aa2ad937ad9 --- /dev/null +++ b/examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/BindingAdapter.kt @@ -0,0 +1,13 @@ +package com.matter.virtual.device.app.feature.main + +import androidx.annotation.DrawableRes +import androidx.appcompat.widget.AppCompatImageView +import androidx.databinding.BindingAdapter + +object BindingAdapter { + @BindingAdapter("imageSrc") + @JvmStatic + fun AppCompatImageView.bindImageSrc(@DrawableRes imgResId: Int) { + this.setImageResource(imgResId) + } +} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/MainFragment.kt b/examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/MainFragment.kt similarity index 74% rename from examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/MainFragment.kt rename to examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/MainFragment.kt index 856006b919ccff..55ebdace76a00e 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/MainFragment.kt +++ b/examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/MainFragment.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.feature.main.ui +package com.matter.virtual.device.app.feature.main import android.content.Context import android.os.Bundle @@ -11,13 +11,10 @@ import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager -import com.samsung.matter.chipstdeviceapp.core.common.DeepLink -import com.samsung.matter.chipstdeviceapp.core.common.MatterSettings -import com.samsung.matter.chipstdeviceapp.feature.main.R -import com.samsung.matter.chipstdeviceapp.feature.main.databinding.FragmentMainBinding -import com.samsung.matter.chipstdeviceapp.feature.main.model.Menu -import com.samsung.matter.chipstdeviceapp.feature.main.ui.adapter.MenuAdapter -import com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview.VerticalSpaceItemDecoration +import com.matter.virtual.device.app.core.common.DeepLink +import com.matter.virtual.device.app.core.common.MatterSettings +import com.matter.virtual.device.app.feature.main.databinding.FragmentMainBinding +import com.matter.virtual.device.app.feature.main.model.Menu import dagger.hilt.android.AndroidEntryPoint import kotlin.math.abs import kotlinx.serialization.ExperimentalSerializationApi @@ -65,20 +62,20 @@ class MainFragment : Fragment() { val menuAdapter = MenuAdapter( - itemList, - object : MenuAdapter.ItemHandler { - override fun onClick(item: Menu) { - val matterSettings = MatterSettings(device = item.device) - val jsonSettings = Json.encodeToString(matterSettings) - try { - findNavController() - .navigate(DeepLink.getDeepLinkRequestForSetupFragment(jsonSettings)) - } catch (e: Exception) { - Timber.e(e, "navigate failure") + object : MenuAdapter.ItemHandler { + override fun onClick(item: Menu) { + val matterSettings = MatterSettings(device = item.device) + val jsonSettings = Json.encodeToString(matterSettings) + try { + findNavController() + .navigate(DeepLink.getDeepLinkRequestForSetupFragment(jsonSettings)) + } catch (e: Exception) { + Timber.e(e, "navigate failure") + } } } - } - ) + ) + .apply { submitList(itemList) } val sideSpace = resources.getDimension(R.dimen.menu_item_side_space).toInt() val bottomSpace = resources.getDimension(R.dimen.menu_item_bottom_space).toInt() diff --git a/examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/MenuAdapter.kt b/examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/MenuAdapter.kt new file mode 100644 index 00000000000000..c3212333d7ec13 --- /dev/null +++ b/examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/MenuAdapter.kt @@ -0,0 +1,46 @@ +package com.matter.virtual.device.app.feature.main + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.matter.virtual.device.app.feature.main.databinding.ItemMenuBinding +import com.matter.virtual.device.app.feature.main.model.Menu + +internal class MenuAdapter(private val itemHandler: ItemHandler) : + ListAdapter( + object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: Menu, newItem: Menu): Boolean { + return oldItem.titleResId == newItem.titleResId + } + + override fun areContentsTheSame(oldItem: Menu, newItem: Menu): Boolean { + return oldItem == newItem + } + } + ) { + + inner class MenuViewHolder(private val binding: ItemMenuBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind(item: Menu) { + binding.item = item + binding.itemHandler = itemHandler + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MenuViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = ItemMenuBinding.inflate(layoutInflater, parent, false) + return MenuViewHolder(binding) + } + + override fun onBindViewHolder(holder: MenuViewHolder, position: Int) { + val item = getItem(position) + holder.bind(item) + } + + interface ItemHandler { + fun onClick(item: Menu) + } +} diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/VerticalSpaceItemDecoration.kt b/examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/VerticalSpaceItemDecoration.kt similarity index 89% rename from examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/VerticalSpaceItemDecoration.kt rename to examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/VerticalSpaceItemDecoration.kt index 67b6be56b7b2e9..fce2d70bd1dc38 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/ui/recyclerview/VerticalSpaceItemDecoration.kt +++ b/examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/VerticalSpaceItemDecoration.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.feature.main.ui.recyclerview +package com.matter.virtual.device.app.feature.main import android.graphics.Rect import android.view.View diff --git a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/model/Menu.kt b/examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/model/Menu.kt similarity index 60% rename from examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/model/Menu.kt rename to examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/model/Menu.kt index 260127778c04e8..67e2658c5bed44 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/java/com/samsung/matter/chipstdeviceapp/feature/main/model/Menu.kt +++ b/examples/virtual-device-app/android/App/feature/main/src/main/java/com/matter/virtual/device/app/feature/main/model/Menu.kt @@ -1,9 +1,9 @@ -package com.samsung.matter.chipstdeviceapp.feature.main.model +package com.matter.virtual.device.app.feature.main.model import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import com.samsung.matter.chipstdeviceapp.core.common.Device -import com.samsung.matter.chipstdeviceapp.feature.main.R +import com.matter.virtual.device.app.core.common.Device +import com.matter.virtual.device.app.feature.main.R enum class Menu( @DrawableRes val iconResId: Int, @@ -13,7 +13,7 @@ enum class Menu( ) { ON_OFF_SWITCH( R.drawable.round_toggle_on_24, - R.string.samsung_on_off_switch, + R.string.matter_on_off_switch, device = Device.OnOffSwitch ) } diff --git a/examples/st-device-app/android/App/feature/main/src/main/res/layout/fragment_main.xml b/examples/virtual-device-app/android/App/feature/main/src/main/res/layout/fragment_main.xml similarity index 100% rename from examples/st-device-app/android/App/feature/main/src/main/res/layout/fragment_main.xml rename to examples/virtual-device-app/android/App/feature/main/src/main/res/layout/fragment_main.xml diff --git a/examples/st-device-app/android/App/feature/main/src/main/res/layout/item_menu.xml b/examples/virtual-device-app/android/App/feature/main/src/main/res/layout/item_menu.xml similarity index 91% rename from examples/st-device-app/android/App/feature/main/src/main/res/layout/item_menu.xml rename to examples/virtual-device-app/android/App/feature/main/src/main/res/layout/item_menu.xml index 32d0d60dc2a0a2..b9b12400969d84 100644 --- a/examples/st-device-app/android/App/feature/main/src/main/res/layout/item_menu.xml +++ b/examples/virtual-device-app/android/App/feature/main/src/main/res/layout/item_menu.xml @@ -6,11 +6,11 @@ + type="com.matter.virtual.device.app.feature.main.MenuAdapter.ItemHandler" /> + type="com.matter.virtual.device.app.feature.main.model.Menu" /> + app:imageSrc="@{item.iconResId}" /> \ No newline at end of file diff --git a/examples/virtual-device-app/android/App/feature/main/src/main/res/values/strings.xml b/examples/virtual-device-app/android/App/feature/main/src/main/res/values/strings.xml new file mode 100644 index 00000000000000..22caae70477e41 --- /dev/null +++ b/examples/virtual-device-app/android/App/feature/main/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Matter Virtual Device + \ No newline at end of file diff --git a/examples/virtual-device-app/android/App/feature/main/src/test/java/com/matter/virtual/device/app/feature/main/ExampleUnitTest.kt b/examples/virtual-device-app/android/App/feature/main/src/test/java/com/matter/virtual/device/app/feature/main/ExampleUnitTest.kt new file mode 100644 index 00000000000000..43846a9c66d208 --- /dev/null +++ b/examples/virtual-device-app/android/App/feature/main/src/test/java/com/matter/virtual/device/app/feature/main/ExampleUnitTest.kt @@ -0,0 +1,16 @@ +package com.matter.virtual.device.app.feature.main + +import org.junit.Assert.* +import org.junit.Test + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/feature/qrcode/.gitignore b/examples/virtual-device-app/android/App/feature/qrcode/.gitignore similarity index 100% rename from examples/st-device-app/android/App/feature/qrcode/.gitignore rename to examples/virtual-device-app/android/App/feature/qrcode/.gitignore diff --git a/examples/st-device-app/android/App/feature/setup/build.gradle.kts b/examples/virtual-device-app/android/App/feature/qrcode/build.gradle.kts similarity index 92% rename from examples/st-device-app/android/App/feature/setup/build.gradle.kts rename to examples/virtual-device-app/android/App/feature/qrcode/build.gradle.kts index 2cd8bba7c0e8bd..f93270453f1efe 100644 --- a/examples/st-device-app/android/App/feature/setup/build.gradle.kts +++ b/examples/virtual-device-app/android/App/feature/qrcode/build.gradle.kts @@ -1,5 +1,5 @@ -import com.samsung.buildsrc.Deps -import com.samsung.buildsrc.Versions +import com.matter.buildsrc.Deps +import com.matter.buildsrc.Versions plugins { id("com.android.library") @@ -10,7 +10,7 @@ plugins { } android { - namespace = "com.samsung.matter.chipstdeviceapp.feature.setup" + namespace = "com.matter.virtual.device.app.feature.qrcode" compileSdk = Versions.compileSdkVersion defaultConfig { diff --git a/examples/st-device-app/android/App/feature/qrcode/proguard-rules.pro b/examples/virtual-device-app/android/App/feature/qrcode/proguard-rules.pro similarity index 100% rename from examples/st-device-app/android/App/feature/qrcode/proguard-rules.pro rename to examples/virtual-device-app/android/App/feature/qrcode/proguard-rules.pro diff --git a/examples/st-device-app/android/App/core/data/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleInstrumentedTest.kt b/examples/virtual-device-app/android/App/feature/qrcode/src/androidTest/java/com/matter/virtual/device/app/feature/qrcode/ExampleInstrumentedTest.kt similarity index 83% rename from examples/st-device-app/android/App/core/data/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleInstrumentedTest.kt rename to examples/virtual-device-app/android/App/feature/qrcode/src/androidTest/java/com/matter/virtual/device/app/feature/qrcode/ExampleInstrumentedTest.kt index 4ec8e63e43ab2c..46eefbbf255810 100644 --- a/examples/st-device-app/android/App/core/data/src/androidTest/java/com/samsung/matter/chipstdeviceapp/core/data/ExampleInstrumentedTest.kt +++ b/examples/virtual-device-app/android/App/feature/qrcode/src/androidTest/java/com/matter/virtual/device/app/feature/qrcode/ExampleInstrumentedTest.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.core.data +package com.matter.virtual.device.app.feature.qrcode import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry @@ -17,6 +17,6 @@ class ExampleInstrumentedTest { fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.samsung.matter.chipstdeviceapp.core.data.test", appContext.packageName) + assertEquals("com.matter.virtual.device.app.feature.qrcode.test", appContext.packageName) } } diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/AndroidManifest.xml b/examples/virtual-device-app/android/App/feature/qrcode/src/main/AndroidManifest.xml similarity index 100% rename from examples/st-device-app/android/App/feature/qrcode/src/main/AndroidManifest.xml rename to examples/virtual-device-app/android/App/feature/qrcode/src/main/AndroidManifest.xml diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt b/examples/virtual-device-app/android/App/feature/qrcode/src/main/java/com/matter/virtual/device/app/feature/qrcode/QrcodeFragment.kt similarity index 91% rename from examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt rename to examples/virtual-device-app/android/App/feature/qrcode/src/main/java/com/matter/virtual/device/app/feature/qrcode/QrcodeFragment.kt index b04077a905f451..e8622ff6f71f45 100644 --- a/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeFragment.kt +++ b/examples/virtual-device-app/android/App/feature/qrcode/src/main/java/com/matter/virtual/device/app/feature/qrcode/QrcodeFragment.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.feature.qrcode +package com.matter.virtual.device.app.feature.qrcode import android.content.Context import android.graphics.Bitmap @@ -13,10 +13,10 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs -import com.samsung.matter.chipstdeviceapp.core.common.MatterConstants -import com.samsung.matter.chipstdeviceapp.core.common.MatterSettings -import com.samsung.matter.chipstdeviceapp.core.common.QrcodeUtil -import com.samsung.matter.chipstdeviceapp.feature.qrcode.databinding.FragmentQrcodeBinding +import com.matter.virtual.device.app.core.common.MatterConstants +import com.matter.virtual.device.app.core.common.MatterSettings +import com.matter.virtual.device.app.core.common.QrcodeUtil +import com.matter.virtual.device.app.feature.qrcode.databinding.FragmentQrcodeBinding import dagger.hilt.android.AndroidEntryPoint import kotlin.math.abs import kotlinx.serialization.ExperimentalSerializationApi @@ -94,8 +94,8 @@ class QrcodeFragment : Fragment() { binding.productIdText.text = getString( R.string.qrcode_product_id_text, - matterSettings.device.productId.toString(), - matterSettings.device.productId + MatterConstants.DEFAULT_PRODUCT_ID.toString(), + MatterConstants.DEFAULT_PRODUCT_ID ) binding.commissioningFlowText.text = getString( @@ -116,6 +116,7 @@ class QrcodeFragment : Fragment() { matterSettings.discriminator ) } + else -> {} } } } diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeViewModel.kt b/examples/virtual-device-app/android/App/feature/qrcode/src/main/java/com/matter/virtual/device/app/feature/qrcode/QrcodeViewModel.kt similarity index 76% rename from examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeViewModel.kt rename to examples/virtual-device-app/android/App/feature/qrcode/src/main/java/com/matter/virtual/device/app/feature/qrcode/QrcodeViewModel.kt index 3ae64cfa400df9..3505f33eef6e78 100644 --- a/examples/st-device-app/android/App/feature/qrcode/src/main/java/com/samsung/matter/chipstdeviceapp/feature/qrcode/QrcodeViewModel.kt +++ b/examples/virtual-device-app/android/App/feature/qrcode/src/main/java/com/matter/virtual/device/app/feature/qrcode/QrcodeViewModel.kt @@ -1,11 +1,11 @@ -package com.samsung.matter.chipstdeviceapp.feature.qrcode +package com.matter.virtual.device.app.feature.qrcode import androidx.lifecycle.* -import com.samsung.matter.chipstdeviceapp.core.common.MatterSettings -import com.samsung.matter.chipstdeviceapp.core.common.successOr -import com.samsung.matter.chipstdeviceapp.core.domain.usecase.matter.GetManualPairingCodeStringUseCase -import com.samsung.matter.chipstdeviceapp.core.domain.usecase.matter.GetQrcodeStringUseCase -import com.samsung.matter.chipstdeviceapp.core.model.Payload +import com.matter.virtual.device.app.core.common.MatterSettings +import com.matter.virtual.device.app.core.common.successOr +import com.matter.virtual.device.app.core.domain.usecase.matter.GetManualPairingCodeStringUseCase +import com.matter.virtual.device.app.core.domain.usecase.matter.GetQrcodeStringUseCase +import com.matter.virtual.device.app.core.model.Payload import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.delay @@ -40,7 +40,6 @@ constructor( val payload = Payload( - productId = matterSettings.device.productId.toInt(), onboardingType = matterSettings.onboardingType, discriminator = matterSettings.discriminator ) diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml b/examples/virtual-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml similarity index 98% rename from examples/st-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml rename to examples/virtual-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml index a8305e4274e9fe..997f74826654a0 100644 --- a/examples/st-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml +++ b/examples/virtual-device-app/android/App/feature/qrcode/src/main/res/layout/fragment_qrcode.xml @@ -6,7 +6,7 @@ + type="com.matter.virtual.device.app.feature.qrcode.QrcodeViewModel" /> + app:layout_behavior="com.matter.virtual.device.app.core.common.ui.DisableAppBarLayoutBehavior"> - + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/qrcode/src/main/res/values/strings.xml b/examples/virtual-device-app/android/App/feature/qrcode/src/main/res/values/strings.xml similarity index 100% rename from examples/st-device-app/android/App/feature/qrcode/src/main/res/values/strings.xml rename to examples/virtual-device-app/android/App/feature/qrcode/src/main/res/values/strings.xml diff --git a/examples/virtual-device-app/android/App/feature/qrcode/src/test/java/com/matter/virtual/device/app/feature/qrcode/ExampleUnitTest.kt b/examples/virtual-device-app/android/App/feature/qrcode/src/test/java/com/matter/virtual/device/app/feature/qrcode/ExampleUnitTest.kt new file mode 100644 index 00000000000000..f4c25e37cccba7 --- /dev/null +++ b/examples/virtual-device-app/android/App/feature/qrcode/src/test/java/com/matter/virtual/device/app/feature/qrcode/ExampleUnitTest.kt @@ -0,0 +1,16 @@ +package com.matter.virtual.device.app.feature.qrcode + +import org.junit.Assert.* +import org.junit.Test + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/feature/setup/.gitignore b/examples/virtual-device-app/android/App/feature/setup/.gitignore similarity index 100% rename from examples/st-device-app/android/App/feature/setup/.gitignore rename to examples/virtual-device-app/android/App/feature/setup/.gitignore diff --git a/examples/st-device-app/android/App/feature/qrcode/build.gradle.kts b/examples/virtual-device-app/android/App/feature/setup/build.gradle.kts similarity index 92% rename from examples/st-device-app/android/App/feature/qrcode/build.gradle.kts rename to examples/virtual-device-app/android/App/feature/setup/build.gradle.kts index d413cc9fb9882c..be40d48f8d5c23 100644 --- a/examples/st-device-app/android/App/feature/qrcode/build.gradle.kts +++ b/examples/virtual-device-app/android/App/feature/setup/build.gradle.kts @@ -1,5 +1,5 @@ -import com.samsung.buildsrc.Deps -import com.samsung.buildsrc.Versions +import com.matter.buildsrc.Deps +import com.matter.buildsrc.Versions plugins { id("com.android.library") @@ -10,7 +10,7 @@ plugins { } android { - namespace = "com.samsung.matter.chipstdeviceapp.feature.qrcode" + namespace = "com.matter.virtual.device.app.feature.setup" compileSdk = Versions.compileSdkVersion defaultConfig { diff --git a/examples/st-device-app/android/App/feature/setup/proguard-rules.pro b/examples/virtual-device-app/android/App/feature/setup/proguard-rules.pro similarity index 100% rename from examples/st-device-app/android/App/feature/setup/proguard-rules.pro rename to examples/virtual-device-app/android/App/feature/setup/proguard-rules.pro diff --git a/examples/virtual-device-app/android/App/feature/setup/src/androidTest/java/com/matter/virtual/device/app/feature/setup/ExampleInstrumentedTest.kt b/examples/virtual-device-app/android/App/feature/setup/src/androidTest/java/com/matter/virtual/device/app/feature/setup/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000000..72a2f97b5ab40c --- /dev/null +++ b/examples/virtual-device-app/android/App/feature/setup/src/androidTest/java/com/matter/virtual/device/app/feature/setup/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package com.matter.virtual.device.app.feature.setup + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.matter.virtual.device.app.feature.setup.test", appContext.packageName) + } +} diff --git a/examples/st-device-app/android/App/feature/setup/src/main/AndroidManifest.xml b/examples/virtual-device-app/android/App/feature/setup/src/main/AndroidManifest.xml similarity index 100% rename from examples/st-device-app/android/App/feature/setup/src/main/AndroidManifest.xml rename to examples/virtual-device-app/android/App/feature/setup/src/main/AndroidManifest.xml diff --git a/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupFragment.kt b/examples/virtual-device-app/android/App/feature/setup/src/main/java/com/matter/virtual/device/app/feature/setup/SetupFragment.kt similarity index 92% rename from examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupFragment.kt rename to examples/virtual-device-app/android/App/feature/setup/src/main/java/com/matter/virtual/device/app/feature/setup/SetupFragment.kt index 21013ad976fdd1..79ede035a2f506 100644 --- a/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupFragment.kt +++ b/examples/virtual-device-app/android/App/feature/setup/src/main/java/com/matter/virtual/device/app/feature/setup/SetupFragment.kt @@ -1,4 +1,4 @@ -package com.samsung.matter.chipstdeviceapp.feature.setup +package com.matter.virtual.device.app.feature.setup import android.os.Bundle import android.view.Gravity @@ -14,11 +14,11 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs -import com.samsung.matter.chipstdeviceapp.core.common.DeepLink -import com.samsung.matter.chipstdeviceapp.core.common.MatterSettings -import com.samsung.matter.chipstdeviceapp.core.model.OnboardingType -import com.samsung.matter.chipstdeviceapp.feature.setup.databinding.DialogSetupContinueBinding -import com.samsung.matter.chipstdeviceapp.feature.setup.databinding.FragmentSetupBinding +import com.matter.virtual.device.app.core.common.DeepLink +import com.matter.virtual.device.app.core.common.MatterSettings +import com.matter.virtual.device.app.core.model.OnboardingType +import com.matter.virtual.device.app.feature.setup.databinding.DialogSetupContinueBinding +import com.matter.virtual.device.app.feature.setup.databinding.FragmentSetupBinding import dagger.hilt.android.AndroidEntryPoint import kotlin.math.abs import kotlinx.coroutines.launch diff --git a/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupViewModel.kt b/examples/virtual-device-app/android/App/feature/setup/src/main/java/com/matter/virtual/device/app/feature/setup/SetupViewModel.kt similarity index 73% rename from examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupViewModel.kt rename to examples/virtual-device-app/android/App/feature/setup/src/main/java/com/matter/virtual/device/app/feature/setup/SetupViewModel.kt index 536aa5a06b1ad3..739af1eb753825 100644 --- a/examples/st-device-app/android/App/feature/setup/src/main/java/com/samsung/matter/chipstdeviceapp/feature/setup/SetupViewModel.kt +++ b/examples/virtual-device-app/android/App/feature/setup/src/main/java/com/matter/virtual/device/app/feature/setup/SetupViewModel.kt @@ -1,8 +1,8 @@ -package com.samsung.matter.chipstdeviceapp.feature.setup +package com.matter.virtual.device.app.feature.setup import androidx.lifecycle.* -import com.samsung.matter.chipstdeviceapp.core.common.successOr -import com.samsung.matter.chipstdeviceapp.core.domain.usecase.network.GetSSIDUseCase +import com.matter.virtual.device.app.core.common.successOr +import com.matter.virtual.device.app.core.domain.usecase.network.GetSSIDUseCase import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.async diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/drawable/dialog_bg.xml b/examples/virtual-device-app/android/App/feature/setup/src/main/res/drawable/dialog_bg.xml similarity index 100% rename from examples/st-device-app/android/App/feature/setup/src/main/res/drawable/dialog_bg.xml rename to examples/virtual-device-app/android/App/feature/setup/src/main/res/drawable/dialog_bg.xml diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/drawable/round_notification_important_24.xml b/examples/virtual-device-app/android/App/feature/setup/src/main/res/drawable/round_notification_important_24.xml similarity index 100% rename from examples/st-device-app/android/App/feature/setup/src/main/res/drawable/round_notification_important_24.xml rename to examples/virtual-device-app/android/App/feature/setup/src/main/res/drawable/round_notification_important_24.xml diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/layout/dialog_setup_continue.xml b/examples/virtual-device-app/android/App/feature/setup/src/main/res/layout/dialog_setup_continue.xml similarity index 100% rename from examples/st-device-app/android/App/feature/setup/src/main/res/layout/dialog_setup_continue.xml rename to examples/virtual-device-app/android/App/feature/setup/src/main/res/layout/dialog_setup_continue.xml diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/layout/fragment_setup.xml b/examples/virtual-device-app/android/App/feature/setup/src/main/res/layout/fragment_setup.xml similarity index 100% rename from examples/st-device-app/android/App/feature/setup/src/main/res/layout/fragment_setup.xml rename to examples/virtual-device-app/android/App/feature/setup/src/main/res/layout/fragment_setup.xml diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/navigation/setup_nav_graph.xml b/examples/virtual-device-app/android/App/feature/setup/src/main/res/navigation/setup_nav_graph.xml similarity index 73% rename from examples/st-device-app/android/App/feature/setup/src/main/res/navigation/setup_nav_graph.xml rename to examples/virtual-device-app/android/App/feature/setup/src/main/res/navigation/setup_nav_graph.xml index 647a075726dc12..cf9536bfe80ac8 100644 --- a/examples/st-device-app/android/App/feature/setup/src/main/res/navigation/setup_nav_graph.xml +++ b/examples/virtual-device-app/android/App/feature/setup/src/main/res/navigation/setup_nav_graph.xml @@ -7,12 +7,12 @@ - + \ No newline at end of file diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/values-ko/strings.xml b/examples/virtual-device-app/android/App/feature/setup/src/main/res/values-ko/strings.xml similarity index 60% rename from examples/st-device-app/android/App/feature/setup/src/main/res/values-ko/strings.xml rename to examples/virtual-device-app/android/App/feature/setup/src/main/res/values-ko/strings.xml index 12cd411ca58c82..b51e7732e3f87c 100644 --- a/examples/st-device-app/android/App/feature/setup/src/main/res/values-ko/strings.xml +++ b/examples/virtual-device-app/android/App/feature/setup/src/main/res/values-ko/strings.xml @@ -1,7 +1,7 @@ 동일한 Wi-Fi에 연결하세요 - SmartThings 앱/허브/디바이스 앱이 동일한 Wi-Fi 네크워크에 연결되어 있는지 확인해 주세요. + 휴대폰/허브/디바이스 앱이 동일한 Wi-Fi 네크워크에 연결되어 있는지 확인해 주세요. 저장 취소 시작 diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/values-night/colors.xml b/examples/virtual-device-app/android/App/feature/setup/src/main/res/values-night/colors.xml similarity index 100% rename from examples/st-device-app/android/App/feature/setup/src/main/res/values-night/colors.xml rename to examples/virtual-device-app/android/App/feature/setup/src/main/res/values-night/colors.xml diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/values/colors.xml b/examples/virtual-device-app/android/App/feature/setup/src/main/res/values/colors.xml similarity index 100% rename from examples/st-device-app/android/App/feature/setup/src/main/res/values/colors.xml rename to examples/virtual-device-app/android/App/feature/setup/src/main/res/values/colors.xml diff --git a/examples/st-device-app/android/App/feature/setup/src/main/res/values/strings.xml b/examples/virtual-device-app/android/App/feature/setup/src/main/res/values/strings.xml similarity index 92% rename from examples/st-device-app/android/App/feature/setup/src/main/res/values/strings.xml rename to examples/virtual-device-app/android/App/feature/setup/src/main/res/values/strings.xml index 59d5d2b474c8d0..e8ae1eb4677b47 100644 --- a/examples/st-device-app/android/App/feature/setup/src/main/res/values/strings.xml +++ b/examples/virtual-device-app/android/App/feature/setup/src/main/res/values/strings.xml @@ -8,7 +8,7 @@ BLE Wi-Fi/BLE Connect to the same Wi-Fi network - Make sure your SmartThings App/Hub/Device App are connected to the same Wi-Fi network. + Make sure your Mobile/Hub/Device App are connected to the same Wi-Fi network. Save Invalid input value Cancel diff --git a/examples/virtual-device-app/android/App/feature/setup/src/test/java/com/matter/virtual/device/app/feature/setup/ExampleUnitTest.kt b/examples/virtual-device-app/android/App/feature/setup/src/test/java/com/matter/virtual/device/app/feature/setup/ExampleUnitTest.kt new file mode 100644 index 00000000000000..79e148b3080371 --- /dev/null +++ b/examples/virtual-device-app/android/App/feature/setup/src/test/java/com/matter/virtual/device/app/feature/setup/ExampleUnitTest.kt @@ -0,0 +1,16 @@ +package com.matter.virtual.device.app.feature.setup + +import org.junit.Assert.* +import org.junit.Test + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/examples/st-device-app/android/App/gradle.properties b/examples/virtual-device-app/android/App/gradle.properties similarity index 96% rename from examples/st-device-app/android/App/gradle.properties rename to examples/virtual-device-app/android/App/gradle.properties index 2b1bc98d5d7ccc..f764d9116e4320 100644 --- a/examples/st-device-app/android/App/gradle.properties +++ b/examples/virtual-device-app/android/App/gradle.properties @@ -25,4 +25,4 @@ matterSdkSourceBuild=false # Point to the SDK build dir without quotes (out/android-arm64-chip-test for # example) to build SDK from source code and debug in Android Studio. # Set to blank to use the SDK prebuilt by scripts/build/build_examples.py. -matterBuildSrcDir=out/android-arm64-chip-st-device-app +matterBuildSrcDir=out/android-arm64-virtual-device-app diff --git a/examples/st-device-app/android/App/gradle/wrapper/gradle-wrapper.jar b/examples/virtual-device-app/android/App/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from examples/st-device-app/android/App/gradle/wrapper/gradle-wrapper.jar rename to examples/virtual-device-app/android/App/gradle/wrapper/gradle-wrapper.jar diff --git a/examples/st-device-app/android/App/gradle/wrapper/gradle-wrapper.properties b/examples/virtual-device-app/android/App/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from examples/st-device-app/android/App/gradle/wrapper/gradle-wrapper.properties rename to examples/virtual-device-app/android/App/gradle/wrapper/gradle-wrapper.properties diff --git a/examples/st-device-app/android/App/gradlew b/examples/virtual-device-app/android/App/gradlew old mode 100755 new mode 100644 similarity index 99% rename from examples/st-device-app/android/App/gradlew rename to examples/virtual-device-app/android/App/gradlew index 5cb14418047190..180cdce0308183 --- a/examples/st-device-app/android/App/gradlew +++ b/examples/virtual-device-app/android/App/gradlew @@ -36,7 +36,7 @@ while [ -h "$PRG" ]; do fi done SAVED="$PWD" -cd "$(dirname \""$PRG"\")/" >/dev/null +cd "$(dirname "$PRG")" >/dev/null APP_HOME="$(pwd -P)" cd "$SAVED" >/dev/null diff --git a/examples/st-device-app/android/App/gradlew.bat b/examples/virtual-device-app/android/App/gradlew.bat similarity index 100% rename from examples/st-device-app/android/App/gradlew.bat rename to examples/virtual-device-app/android/App/gradlew.bat diff --git a/examples/st-device-app/android/App/settings.gradle.kts b/examples/virtual-device-app/android/App/settings.gradle.kts similarity index 92% rename from examples/st-device-app/android/App/settings.gradle.kts rename to examples/virtual-device-app/android/App/settings.gradle.kts index bd012ac2f702e1..0ae5b79223eba3 100644 --- a/examples/st-device-app/android/App/settings.gradle.kts +++ b/examples/virtual-device-app/android/App/settings.gradle.kts @@ -12,7 +12,7 @@ dependencyResolutionManagement { mavenCentral() } } -rootProject.name = "CHIPStDeviceApp" +rootProject.name = "VirtualDeviceApp" include(":app") include(":core:common") include(":core:data") diff --git a/examples/st-device-app/android/BUILD.gn b/examples/virtual-device-app/android/BUILD.gn similarity index 78% rename from examples/st-device-app/android/BUILD.gn rename to examples/virtual-device-app/android/BUILD.gn index 558101f047b660..828856455c325f 100644 --- a/examples/st-device-app/android/BUILD.gn +++ b/examples/virtual-device-app/android/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2021 Project CHIP Authors +# Copyright (c) 2023 Project CHIP Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -20,23 +20,23 @@ import("${chip_root}/build/chip/java/rules.gni") import("${chip_root}/build/chip/tools.gni") shared_library("jni") { - output_name = "libStDeviceApp" + output_name = "libDeviceApp" sources = [ - "${chip_root}/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h", + "${chip_root}/examples/virtual-device-app/virtual-device-common/include/CHIPProjectAppConfig.h", "java/AppImpl.cpp", "java/AppImpl.h", "java/ClusterChangeAttribute.cpp", + "java/DeviceApp-JNI.cpp", "java/JNIDACProvider.cpp", "java/JNIDACProvider.h", "java/OnOffManager.cpp", "java/OnOffManager.h", - "java/StDeviceApp-JNI.cpp", ] deps = [ "${chip_root}/examples/platform/linux:commissioner-main", - "${chip_root}/examples/st-device-app/st-device-common", + "${chip_root}/examples/virtual-device-app/virtual-device-common", "${chip_root}/src/app/server/java:jni", "${chip_root}/src/lib", "${chip_root}/src/lib/support/jsontlv", @@ -51,7 +51,7 @@ shared_library("jni") { } android_library("java") { - output_name = "StDeviceApp.jar" + output_name = "DeviceApp.jar" deps = [ ":android", @@ -64,10 +64,10 @@ android_library("java") { ] sources = [ - "java/src/com/samsung/matter/stdeviceapp/DACProvider.java", - "java/src/com/samsung/matter/stdeviceapp/OnOffManager.java", - "java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java", - "java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java", + "java/src/com/matter/virtual/device/app/DACProvider.java", + "java/src/com/matter/virtual/device/app/OnOffManager.java", + "java/src/com/matter/virtual/device/app/DeviceApp.java", + "java/src/com/matter/virtual/device/app/DeviceAppCallback.java", ] javac_flags = [ "-Xlint:deprecation" ] diff --git a/examples/st-device-app/android/README.md b/examples/virtual-device-app/android/README.md similarity index 79% rename from examples/st-device-app/android/README.md rename to examples/virtual-device-app/android/README.md index 9fa17105288eb1..afbef7087ea662 100644 --- a/examples/st-device-app/android/README.md +++ b/examples/virtual-device-app/android/README.md @@ -1,4 +1,4 @@ -# Matter Android Device App Example +# Matter Android Virtual Device App Example This is a Matter Android Device app that can be used as a commissionee device. @@ -11,7 +11,7 @@ This app offers the following features:
-- [Matter Android Device App Example](#matter-android-device-app-example) +- [Matter Android Virtual Device App Example](#matter-android-virtual-device-app-example) - [Requirements for building](#requirements-for-building) - [Preparing for build](#preparing-for-build) - [Building & Installing the app](#building--installing-the-app) @@ -45,17 +45,17 @@ This is the simplest option. In the command line, run the following command from the top Matter directory: ```shell -./scripts/build/build_examples.py --target android-arm64-st-device-app build +./scripts/build/build_examples.py --target android-arm64-virtual-device-app build ``` See the table above for other values of `TARGET_CPU`. The debug Android package `app-debug.apk` will be generated at -`out/android-$TARGET_CPU-st-device-app/outputs/apk/debug/`, and can be installed +`out/android-$TARGET_CPU-virtual-device-app/outputs/apk/debug/`, and can be installed with ```shell -adb install out/android-$TARGET_CPU-st-device-app/outputs/apk/debug/app-debug.apk +adb install out/android-$TARGET_CPU-virtual-device-app/outputs/apk/debug/app-debug.apk ``` You can use Android Studio to edit the Android app itself and run it after diff --git a/examples/st-device-app/android/args.gni b/examples/virtual-device-app/android/args.gni similarity index 88% rename from examples/st-device-app/android/args.gni rename to examples/virtual-device-app/android/args.gni index b2ae2c18e499c5..c0afd7b1557a0d 100644 --- a/examples/st-device-app/android/args.gni +++ b/examples/virtual-device-app/android/args.gni @@ -1,4 +1,4 @@ -# Copyright (c) 2020-2022 Project CHIP Authors +# Copyright (c) 2023 Project CHIP Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ chip_project_config_include = "" chip_system_project_config_include = "" chip_project_config_include_dirs = - [ "${chip_root}/examples/st-device-app/st-device-common/include" ] + [ "${chip_root}/examples/virtual-device-app/virtual-device-common/include" ] chip_project_config_include_dirs += [ "${chip_root}/config/standalone" ] chip_build_libshell = true diff --git a/examples/st-device-app/android/build_overrides b/examples/virtual-device-app/android/build_overrides similarity index 100% rename from examples/st-device-app/android/build_overrides rename to examples/virtual-device-app/android/build_overrides diff --git a/examples/st-device-app/android/java/AppImpl.cpp b/examples/virtual-device-app/android/java/AppImpl.cpp similarity index 94% rename from examples/st-device-app/android/java/AppImpl.cpp rename to examples/virtual-device-app/android/java/AppImpl.cpp index df85d9528e418c..34543d4bb526f8 100644 --- a/examples/st-device-app/android/java/AppImpl.cpp +++ b/examples/virtual-device-app/android/java/AppImpl.cpp @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,7 @@ */ #include "AppImpl.h" -#include "StDeviceApp-JNI.h" +#include "DeviceApp-JNI.h" #include #include @@ -67,7 +67,7 @@ void DeviceEventCallback(const ChipDeviceEvent * event, intptr_t arg) break; } - StDeviceAppJNIMgr().PostEvent(event->Type); + DeviceAppJNIMgr().PostEvent(event->Type); } static int kFabricRemoved = 0x9FFF; // out of public event range (0x8000) @@ -79,7 +79,7 @@ class FabricDelegate : public FabricTable::Delegate ChipLogProgress(DeviceLayer, "OnFabricRemoved():FabricCount[%d],FabricIndex[%d]", fabricTable.FabricCount(), fabricIndex); if (fabricTable.FabricCount() == 0) { - StDeviceAppJNIMgr().PostEvent(kFabricRemoved); + DeviceAppJNIMgr().PostEvent(kFabricRemoved); } } }; diff --git a/examples/st-device-app/android/java/AppImpl.h b/examples/virtual-device-app/android/java/AppImpl.h similarity index 93% rename from examples/st-device-app/android/java/AppImpl.h rename to examples/virtual-device-app/android/java/AppImpl.h index 9b5446ae25f041..9ac6ae1037f9f6 100644 --- a/examples/st-device-app/android/java/AppImpl.h +++ b/examples/virtual-device-app/android/java/AppImpl.h @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/examples/st-device-app/android/java/ClusterChangeAttribute.cpp b/examples/virtual-device-app/android/java/ClusterChangeAttribute.cpp similarity index 92% rename from examples/st-device-app/android/java/ClusterChangeAttribute.cpp rename to examples/virtual-device-app/android/java/ClusterChangeAttribute.cpp index fd9c2242717bff..54e862dcd0dfe5 100644 --- a/examples/st-device-app/android/java/ClusterChangeAttribute.cpp +++ b/examples/virtual-device-app/android/java/ClusterChangeAttribute.cpp @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -41,7 +41,7 @@ static void OnOffClusterAttributeChangeCallback(const app::ConcreteAttributePath void MatterPostAttributeChangeCallback(const app::ConcreteAttributePath & attributePath, uint8_t type, uint16_t size, uint8_t * value) { - ChipLogProgress(Zcl, "[ST Device] clusterId:%d,attributeId:%d,endpoint:%d", attributePath.mClusterId, + ChipLogProgress(Zcl, "[Device] clusterId:%d,attributeId:%d,endpoint:%d", attributePath.mClusterId, attributePath.mAttributeId, static_cast(attributePath.mEndpointId)); switch (attributePath.mClusterId) diff --git a/examples/st-device-app/android/java/StDeviceApp-JNI.cpp b/examples/virtual-device-app/android/java/DeviceApp-JNI.cpp similarity index 68% rename from examples/st-device-app/android/java/StDeviceApp-JNI.cpp rename to examples/virtual-device-app/android/java/DeviceApp-JNI.cpp index 15d36640d66f48..1f1b918b6d1aee 100644 --- a/examples/st-device-app/android/java/StDeviceApp-JNI.cpp +++ b/examples/virtual-device-app/android/java/DeviceApp-JNI.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,7 @@ * */ -#include "StDeviceApp-JNI.h" +#include "DeviceApp-JNI.h" #include "AppImpl.h" #include "JNIDACProvider.h" @@ -40,65 +40,65 @@ using namespace chip::Credentials; using namespace chip::DeviceLayer; #define JNI_METHOD(RETURN, METHOD_NAME) \ - extern "C" JNIEXPORT RETURN JNICALL Java_com_samsung_matter_stdeviceapp_StDeviceApp_##METHOD_NAME + extern "C" JNIEXPORT RETURN JNICALL Java_com_matter_virtual_device_app_DeviceApp_##METHOD_NAME #define DEVICE_VERSION_DEFAULT 1 EmberAfDeviceType gDeviceTypeIds[] = { { 0, DEVICE_VERSION_DEFAULT } }; -StDeviceAppJNI StDeviceAppJNI::sInstance; +DeviceAppJNI DeviceAppJNI::sInstance; -void StDeviceAppJNI::InitializeWithObjects(jobject app) +void DeviceAppJNI::InitializeWithObjects(jobject app) { JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); - VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for StDeviceAppJNI")); + VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for DeviceAppJNI")); - mStDeviceAppObject = env->NewGlobalRef(app); - VerifyOrReturn(mStDeviceAppObject != nullptr, ChipLogError(Zcl, "Failed to NewGlobalRef StDeviceAppJNI")); + mDeviceAppObject = env->NewGlobalRef(app); + VerifyOrReturn(mDeviceAppObject != nullptr, ChipLogError(Zcl, "Failed to NewGlobalRef DeviceAppJNI")); - jclass managerClass = env->GetObjectClass(mStDeviceAppObject); - VerifyOrReturn(managerClass != nullptr, ChipLogError(Zcl, "Failed to get StDeviceAppJNI Java class")); + jclass managerClass = env->GetObjectClass(mDeviceAppObject); + VerifyOrReturn(managerClass != nullptr, ChipLogError(Zcl, "Failed to get DeviceAppJNI Java class")); mPostClusterInitMethod = env->GetMethodID(managerClass, "postClusterInit", "(II)V"); if (mPostClusterInitMethod == nullptr) { - ChipLogError(Zcl, "Failed to access StDeviceApp 'postClusterInit' method"); + ChipLogError(Zcl, "Failed to access DeviceApp 'postClusterInit' method"); env->ExceptionClear(); } mPostEventMethod = env->GetMethodID(managerClass, "postEvent", "(I)V"); if (mPostEventMethod == nullptr) { - ChipLogError(Zcl, "Failed to access StDeviceApp 'postEvent' method"); + ChipLogError(Zcl, "Failed to access DeviceApp 'postEvent' method"); env->ExceptionClear(); } } -void StDeviceAppJNI::PostClusterInit(int clusterId, int endpoint) +void DeviceAppJNI::PostClusterInit(int clusterId, int endpoint) { JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); - VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for StDeviceAppJNI::PostClusterInit")); - VerifyOrReturn(mStDeviceAppObject != nullptr, ChipLogError(Zcl, "StDeviceAppJNI::mStDeviceAppObject null")); - VerifyOrReturn(mPostClusterInitMethod != nullptr, ChipLogError(Zcl, "StDeviceAppJNI::mPostClusterInitMethod null")); + VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for DeviceAppJNI::PostClusterInit")); + VerifyOrReturn(mDeviceAppObject != nullptr, ChipLogError(Zcl, "DeviceAppJNI::mDeviceAppObject null")); + VerifyOrReturn(mPostClusterInitMethod != nullptr, ChipLogError(Zcl, "DeviceAppJNI::mPostClusterInitMethod null")); - env->CallVoidMethod(mStDeviceAppObject, mPostClusterInitMethod, static_cast(clusterId), static_cast(endpoint)); + env->CallVoidMethod(mDeviceAppObject, mPostClusterInitMethod, static_cast(clusterId), static_cast(endpoint)); if (env->ExceptionCheck()) { - ChipLogError(Zcl, "Failed to call StDeviceAppJNI 'postClusterInit' method"); + ChipLogError(Zcl, "Failed to call DeviceAppJNI 'postClusterInit' method"); env->ExceptionClear(); } } -void StDeviceAppJNI::PostEvent(int event) +void DeviceAppJNI::PostEvent(int event) { JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); - VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for StDeviceAppJNI::PostEvent")); - VerifyOrReturn(mStDeviceAppObject != nullptr, ChipLogError(Zcl, "StDeviceAppJNI::mStDeviceAppObject null")); - VerifyOrReturn(mPostEventMethod != nullptr, ChipLogError(Zcl, "StDeviceAppJNI::mPostEventMethod null")); + VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for DeviceAppJNI::PostEvent")); + VerifyOrReturn(mDeviceAppObject != nullptr, ChipLogError(Zcl, "DeviceAppJNI::mDeviceAppObject null")); + VerifyOrReturn(mPostEventMethod != nullptr, ChipLogError(Zcl, "DeviceAppJNI::mPostEventMethod null")); - env->CallVoidMethod(mStDeviceAppObject, mPostEventMethod, static_cast(event)); + env->CallVoidMethod(mDeviceAppObject, mPostEventMethod, static_cast(event)); if (env->ExceptionCheck()) { - ChipLogError(Zcl, "Failed to call StDeviceAppJNI 'postEventMethod' method"); + ChipLogError(Zcl, "Failed to call DeviceAppJNI 'postEventMethod' method"); env->ExceptionClear(); } } @@ -115,13 +115,13 @@ void JNI_OnUnload(JavaVM * jvm, void * reserved) JNI_METHOD(void, nativeInit)(JNIEnv *, jobject app) { - StDeviceAppJNIMgr().InitializeWithObjects(app); + DeviceAppJNIMgr().InitializeWithObjects(app); } JNI_METHOD(void, preServerInit)(JNIEnv *, jobject app) { chip::DeviceLayer::StackLock lock; - ChipLogProgress(Zcl, "StDeviceAppJNI::preServerInit"); + ChipLogProgress(Zcl, "DeviceAppJNI::preServerInit"); PreServerInit(); } @@ -129,7 +129,7 @@ JNI_METHOD(void, preServerInit)(JNIEnv *, jobject app) JNI_METHOD(void, postServerInit)(JNIEnv *, jobject app, jint deviceTypeId) { chip::DeviceLayer::StackLock lock; - ChipLogProgress(Zcl, "StDeviceAppJNI::postServerInit"); + ChipLogProgress(Zcl, "DeviceAppJNI::postServerInit"); gDeviceTypeIds[0].deviceId = static_cast(deviceTypeId); emberAfSetDeviceTypeList(1, Span(gDeviceTypeIds)); diff --git a/examples/st-device-app/android/java/StDeviceApp-JNI.h b/examples/virtual-device-app/android/java/DeviceApp-JNI.h similarity index 75% rename from examples/st-device-app/android/java/StDeviceApp-JNI.h rename to examples/virtual-device-app/android/java/DeviceApp-JNI.h index bac44dc1f3aec8..c2372140f62de1 100644 --- a/examples/st-device-app/android/java/StDeviceApp-JNI.h +++ b/examples/virtual-device-app/android/java/DeviceApp-JNI.h @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,7 +20,7 @@ #include -class StDeviceAppJNI +class DeviceAppJNI { public: void InitializeWithObjects(jobject app); @@ -28,15 +28,15 @@ class StDeviceAppJNI void PostEvent(int event); private: - friend StDeviceAppJNI & StDeviceAppJNIMgr(); + friend DeviceAppJNI & DeviceAppJNIMgr(); - static StDeviceAppJNI sInstance; - jobject mStDeviceAppObject = nullptr; + static DeviceAppJNI sInstance; + jobject mDeviceAppObject = nullptr; jmethodID mPostClusterInitMethod = nullptr; jmethodID mPostEventMethod = nullptr; }; -inline class StDeviceAppJNI & StDeviceAppJNIMgr() +inline class DeviceAppJNI & DeviceAppJNIMgr() { - return StDeviceAppJNI::sInstance; + return DeviceAppJNI::sInstance; } diff --git a/examples/st-device-app/android/java/JNIDACProvider.cpp b/examples/virtual-device-app/android/java/JNIDACProvider.cpp similarity index 99% rename from examples/st-device-app/android/java/JNIDACProvider.cpp rename to examples/virtual-device-app/android/java/JNIDACProvider.cpp index d47db4ead12c5c..2b3f72e8c7e85b 100644 --- a/examples/st-device-app/android/java/JNIDACProvider.cpp +++ b/examples/virtual-device-app/android/java/JNIDACProvider.cpp @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/st-device-app/android/java/JNIDACProvider.h b/examples/virtual-device-app/android/java/JNIDACProvider.h similarity index 97% rename from examples/st-device-app/android/java/JNIDACProvider.h rename to examples/virtual-device-app/android/java/JNIDACProvider.h index a9181dc59295b3..e2bad80e226f9f 100644 --- a/examples/st-device-app/android/java/JNIDACProvider.h +++ b/examples/virtual-device-app/android/java/JNIDACProvider.h @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2021 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/st-device-app/android/java/OnOffManager.cpp b/examples/virtual-device-app/android/java/OnOffManager.cpp similarity index 85% rename from examples/st-device-app/android/java/OnOffManager.cpp rename to examples/virtual-device-app/android/java/OnOffManager.cpp index 08ce45eb817aa4..a18577598d7471 100644 --- a/examples/st-device-app/android/java/OnOffManager.cpp +++ b/examples/virtual-device-app/android/java/OnOffManager.cpp @@ -1,6 +1,6 @@ /** * - * Copyright (c) 2022 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ * limitations under the License. */ #include "OnOffManager.h" -#include "StDeviceApp-JNI.h" +#include "DeviceApp-JNI.h" #include #include #include @@ -38,25 +38,25 @@ static_assert(kOnffManagerTableSize <= kEmberInvalidEndpointIndex, "gOnOffManage void emberAfOnOffClusterInitCallback(EndpointId endpoint) { - ChipLogProgress(Zcl, "ST Device App::OnOff::PostClusterInit"); - StDeviceAppJNIMgr().PostClusterInit(chip::app::Clusters::OnOff::Id, endpoint); + ChipLogProgress(Zcl, "Device App::OnOff::PostClusterInit"); + DeviceAppJNIMgr().PostClusterInit(chip::app::Clusters::OnOff::Id, endpoint); } void OnOffManager::NewManager(jint endpoint, jobject manager) { - ChipLogProgress(Zcl, "ST Device App: OnOffManager::NewManager"); + ChipLogProgress(Zcl, "Device App: OnOffManager::NewManager"); uint16_t ep = emberAfGetClusterServerEndpointIndex(static_cast(endpoint), app::Clusters::OnOff::Id, EMBER_AF_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT); VerifyOrReturn(ep < kOnffManagerTableSize, - ChipLogError(Zcl, "ST Device App::OnOff::NewManager: endpoint %d not found", endpoint)); + ChipLogError(Zcl, "Device App::OnOff::NewManager: endpoint %d not found", endpoint)); VerifyOrReturn(gOnOffManagerTable[ep] == nullptr, - ChipLogError(Zcl, "ST Device App::OnOff::NewManager: endpoint %d already has a manager", endpoint)); + ChipLogError(Zcl, "Device App::OnOff::NewManager: endpoint %d already has a manager", endpoint)); OnOffManager * mgr = new OnOffManager(); CHIP_ERROR err = mgr->InitializeWithObjects(manager); if (err != CHIP_NO_ERROR) { - ChipLogError(Zcl, "ST Device App::OnOff::NewManager: failed to initialize manager for endpoint %d", endpoint); + ChipLogError(Zcl, "Device App::OnOff::NewManager: failed to initialize manager for endpoint %d", endpoint); delete mgr; } else @@ -74,7 +74,7 @@ OnOffManager * GetOnOffManager(EndpointId endpoint) void OnOffManager::PostOnOffChanged(chip::EndpointId endpoint, bool value) { - ChipLogProgress(Zcl, "ST Device App: OnOffManager::PostOnOffChange"); + ChipLogProgress(Zcl, "Device App: OnOffManager::PostOnOffChange"); OnOffManager * mgr = GetOnOffManager(endpoint); VerifyOrReturn(mgr != nullptr, ChipLogError(Zcl, "OnOffManager null")); diff --git a/examples/st-device-app/android/java/OnOffManager.h b/examples/virtual-device-app/android/java/OnOffManager.h similarity index 97% rename from examples/st-device-app/android/java/OnOffManager.h rename to examples/virtual-device-app/android/java/OnOffManager.h index 02420b8fd14dd3..7305d10c46b22e 100644 --- a/examples/st-device-app/android/java/OnOffManager.h +++ b/examples/virtual-device-app/android/java/OnOffManager.h @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2022 Project CHIP Authors + * Copyright (c) 2023 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/DACProvider.java b/examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/DACProvider.java similarity index 95% rename from examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/DACProvider.java rename to examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/DACProvider.java index 78e12707f5bb2c..5113f99a806509 100644 --- a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/DACProvider.java +++ b/examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/DACProvider.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package com.samsung.matter.stdeviceapp; +package com.matter.virtual.device.app; public interface DACProvider { byte[] GetCertificationDeclaration(); diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java b/examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/DeviceApp.java similarity index 86% rename from examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java rename to examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/DeviceApp.java index 55ca4b0eec8249..6d86374cdf7b0c 100644 --- a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceApp.java +++ b/examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/DeviceApp.java @@ -15,15 +15,15 @@ * limitations under the License. * */ -package com.samsung.matter.stdeviceapp; +package com.matter.virtual.device.app; import android.util.Log; -public class StDeviceApp { - private StDeviceAppCallback mCallback; - private static final String TAG = "StDeviceApp"; +public class DeviceApp { + private DeviceAppCallback mCallback; + private static final String TAG = "DeviceApp"; - public StDeviceApp(StDeviceAppCallback callback) { + public DeviceApp(DeviceAppCallback callback) { mCallback = callback; nativeInit(); } @@ -57,6 +57,6 @@ private void postEvent(int event) { public native void setDACProvider(DACProvider provider); static { - System.loadLibrary("StDeviceApp"); + System.loadLibrary("DeviceApp"); } } diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java b/examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/DeviceAppCallback.java similarity index 82% rename from examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java rename to examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/DeviceAppCallback.java index 18401bb3127819..d0cb46a341d448 100644 --- a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/StDeviceAppCallback.java +++ b/examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/DeviceAppCallback.java @@ -14,10 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.samsung.matter.stdeviceapp; +package com.matter.virtual.device.app; -public interface StDeviceAppCallback { - void onClusterInit(StDeviceApp app, int clusterId, int endpoint); +public interface DeviceAppCallback { + void onClusterInit(DeviceApp app, int clusterId, int endpoint); void onEvent(int event); } diff --git a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/OnOffManager.java b/examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/OnOffManager.java similarity index 75% rename from examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/OnOffManager.java rename to examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/OnOffManager.java index b2d4a175b8cca2..f4f87a28881273 100644 --- a/examples/st-device-app/android/java/src/com/samsung/matter/stdeviceapp/OnOffManager.java +++ b/examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/OnOffManager.java @@ -1,8 +1,9 @@ -package com.samsung.matter.stdeviceapp; +package com.matter.virtual.device.app; public interface OnOffManager { /** - * Notify that the OnOff value be changed by matter and should effect it. Note, set by TvApp will + * Notify that the OnOff value be changed by matter and should effect it. Note, + * set by TvApp will * also trigger this function, so must check if value is same * * @param value diff --git a/examples/st-device-app/android/third_party/connectedhomeip b/examples/virtual-device-app/android/third_party/connectedhomeip similarity index 100% rename from examples/st-device-app/android/third_party/connectedhomeip rename to examples/virtual-device-app/android/third_party/connectedhomeip diff --git a/examples/st-device-app/st-device-common/BUILD.gn b/examples/virtual-device-app/virtual-device-common/BUILD.gn similarity index 83% rename from examples/st-device-app/st-device-common/BUILD.gn rename to examples/virtual-device-app/virtual-device-common/BUILD.gn index 15e4ae830a4097..73be6ac9628be1 100644 --- a/examples/st-device-app/st-device-common/BUILD.gn +++ b/examples/virtual-device-app/virtual-device-common/BUILD.gn @@ -17,10 +17,10 @@ import("//build_overrides/chip.gni") import("${chip_root}/src/app/chip_data_model.gni") import("${chip_root}/src/lib/lib.gni") -chip_data_model("st-device-common") { - zap_file = "st-device-app.zap" +chip_data_model("virtual-device-common") { + zap_file = "virtual-device-app.zap" zap_pregenerated_dir = - "${chip_root}/zzz_generated/st-device-app/zap-generated" + "${chip_root}/zzz_generated/virtual-device-app/zap-generated" is_server = true } diff --git a/examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h b/examples/virtual-device-app/virtual-device-common/include/CHIPProjectAppConfig.h similarity index 100% rename from examples/st-device-app/st-device-common/include/CHIPProjectAppConfig.h rename to examples/virtual-device-app/virtual-device-common/include/CHIPProjectAppConfig.h diff --git a/examples/st-device-app/st-device-common/st-device-app.matter b/examples/virtual-device-app/virtual-device-common/virtual-device-app.matter similarity index 100% rename from examples/st-device-app/st-device-common/st-device-app.matter rename to examples/virtual-device-app/virtual-device-common/virtual-device-app.matter diff --git a/examples/st-device-app/st-device-common/st-device-app.zap b/examples/virtual-device-app/virtual-device-common/virtual-device-app.zap similarity index 100% rename from examples/st-device-app/st-device-common/st-device-app.zap rename to examples/virtual-device-app/virtual-device-common/virtual-device-app.zap diff --git a/scripts/build/build/targets.py b/scripts/build/build/targets.py index d3b8d256e1cf44..877d98564de512 100755 --- a/scripts/build/build/targets.py +++ b/scripts/build/build/targets.py @@ -328,7 +328,8 @@ def BuildAndroidTarget(): TargetPart('tv-casting-app', app=AndroidApp.TV_CASTING_APP), TargetPart('java-matter-controller', app=AndroidApp.JAVA_MATTER_CONTROLLER), - TargetPart('st-device-app', app=AndroidApp.ST_DEVICE_APP), + TargetPart('virtual-device-app', + app=AndroidApp.VIRTUAL_DEVICE_APP), ]) # Modifiers diff --git a/scripts/build/builders/android.py b/scripts/build/builders/android.py index daa4cc15acfc37..9ec924fa2ff33e 100644 --- a/scripts/build/builders/android.py +++ b/scripts/build/builders/android.py @@ -71,7 +71,7 @@ class AndroidApp(Enum): TV_SERVER = auto() TV_CASTING_APP = auto() JAVA_MATTER_CONTROLLER = auto() - ST_DEVICE_APP = auto() + VIRTUAL_DEVICE_APP = auto() def AppName(self): if self == AndroidApp.CHIP_TOOL: @@ -82,8 +82,8 @@ def AppName(self): return "tv-server" elif self == AndroidApp.TV_CASTING_APP: return "tv-casting" - elif self == AndroidApp.ST_DEVICE_APP: - return "st-device-app" + elif self == AndroidApp.VIRTUAL_DEVICE_APP: + return "virtual-device-app" else: raise Exception("Unknown app type: %r" % self) @@ -94,7 +94,7 @@ def AppGnArgs(self): gn_args["chip_config_network_layer_ble"] = False elif self == AndroidApp.TV_CASTING_APP: gn_args["chip_config_network_layer_ble"] = False - elif self == AndroidApp.ST_DEVICE_APP: + elif self == AndroidApp.VIRTUAL_DEVICE_APP: gn_args["chip_config_network_layer_ble"] = True return gn_args @@ -103,8 +103,8 @@ def ExampleName(self): return "tv-app" elif self == AndroidApp.TV_CASTING_APP: return "tv-casting-app" - elif self == AndroidApp.ST_DEVICE_APP: - return "st-device-app" + elif self == AndroidApp.VIRTUAL_DEVICE_APP: + return "virtual-device-app" else: return None @@ -308,7 +308,7 @@ def gradlewBuildExampleAndroid(self): self.identifier, module), ) else: - if self.app.ExampleName() == "st-device-app": + if self.app.ExampleName() == "virtual-device-app": self._Execute( [ "%s/examples/%s/android/App/gradlew" @@ -508,7 +508,7 @@ def _build(self): self.copyToExampleApp(jnilibs_dir, libs_dir, libs, jars) self.gradlewBuildExampleAndroid() - elif exampleName == "st-device-app": + elif exampleName == "virtual-device-app": jnilibs_dir = os.path.join( self.root, "examples/", @@ -521,13 +521,13 @@ def _build(self): self.root, "examples/", self.app.ExampleName(), "android/App/app/libs" ) - libs = ["libc++_shared.so", "libStDeviceApp.so"] + libs = ["libc++_shared.so", "libDeviceApp.so"] jars = { "OnboardingPayload.jar": "third_party/connectedhomeip/src/controller/java/OnboardingPayload.jar", "AndroidPlatform.jar": "third_party/connectedhomeip/src/platform/android/AndroidPlatform.jar", "CHIPAppServer.jar": "third_party/connectedhomeip/src/app/server/java/CHIPAppServer.jar", - "StDeviceApp.jar": "StDeviceApp.jar", + "DeviceApp.jar": "DeviceApp.jar", } self.copyToExampleApp(jnilibs_dir, libs_dir, libs, jars) From e977d82e0f8d6daa5a516608a67c20412771eba5 Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Mon, 17 Jul 2023 18:00:34 +0900 Subject: [PATCH 27/36] virtual-device-app: chmod for gradle Signed-off-by: Jaehoon You Signed-off-by: Charles Kim --- .../android/App/gradle/wrapper/gradle-wrapper.jar | Bin examples/virtual-device-app/android/App/gradlew | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 examples/virtual-device-app/android/App/gradle/wrapper/gradle-wrapper.jar mode change 100644 => 100755 examples/virtual-device-app/android/App/gradlew diff --git a/examples/virtual-device-app/android/App/gradle/wrapper/gradle-wrapper.jar b/examples/virtual-device-app/android/App/gradle/wrapper/gradle-wrapper.jar old mode 100644 new mode 100755 diff --git a/examples/virtual-device-app/android/App/gradlew b/examples/virtual-device-app/android/App/gradlew old mode 100644 new mode 100755 From f6da08a887f6a7898f2d78b50016cf6ff628cd69 Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Mon, 17 Jul 2023 18:04:29 +0900 Subject: [PATCH 28/36] virtual-device-app: apply common build script Signed-off-by: Jaehoon You Signed-off-by: Charles Kim --- .../android/App/build.gradle.kts | 4 ++ examples/virtual-device-app/android/README.md | 4 +- scripts/build/builders/android.py | 65 ++++++------------- 3 files changed, 26 insertions(+), 47 deletions(-) diff --git a/examples/virtual-device-app/android/App/build.gradle.kts b/examples/virtual-device-app/android/App/build.gradle.kts index f0149f2bed0926..03ba9c9b33c1e3 100644 --- a/examples/virtual-device-app/android/App/build.gradle.kts +++ b/examples/virtual-device-app/android/App/build.gradle.kts @@ -16,6 +16,10 @@ buildscript { } } +allprojects { + buildDir = File("${rootProject.buildDir}/${project.name}") +} + tasks.register("clean", Delete::class) { delete(rootProject.buildDir) } diff --git a/examples/virtual-device-app/android/README.md b/examples/virtual-device-app/android/README.md index afbef7087ea662..bad2cf1ebdf657 100644 --- a/examples/virtual-device-app/android/README.md +++ b/examples/virtual-device-app/android/README.md @@ -51,11 +51,11 @@ the top Matter directory: See the table above for other values of `TARGET_CPU`. The debug Android package `app-debug.apk` will be generated at -`out/android-$TARGET_CPU-virtual-device-app/outputs/apk/debug/`, and can be installed +`out/android-$TARGET_CPU-virtual-device-app/VirtualDeviceApp/app/outputs/apk/debug/`, and can be installed with ```shell -adb install out/android-$TARGET_CPU-virtual-device-app/outputs/apk/debug/app-debug.apk +adb install out/android-$TARGET_CPU-virtual-device-app/VirtualDeviceApp/app/outputs/apk/debug/app-debug.apk ``` You can use Android Studio to edit the Android app itself and run it after diff --git a/scripts/build/builders/android.py b/scripts/build/builders/android.py index 9ec924fa2ff33e..cd358798c218fc 100644 --- a/scripts/build/builders/android.py +++ b/scripts/build/builders/android.py @@ -308,35 +308,20 @@ def gradlewBuildExampleAndroid(self): self.identifier, module), ) else: - if self.app.ExampleName() == "virtual-device-app": - self._Execute( - [ - "%s/examples/%s/android/App/gradlew" - % (self.root, self.app.ExampleName()), - "-p", - "%s/examples/%s/android/App/" % (self.root, - self.app.ExampleName()), - "-PmatterBuildSrcDir=%s" % self.output_dir, - "-PmatterSdkSourceBuild=false", - ":app:assembleDebug", - ], - title="Building Example " + self.identifier, - ) - else: - self._Execute( - [ - "%s/examples/%s/android/App/gradlew" - % (self.root, self.app.ExampleName()), - "-p", - "%s/examples/%s/android/App/" % (self.root, - self.app.ExampleName()), - "-PmatterBuildSrcDir=%s" % self.output_dir, - "-PmatterSdkSourceBuild=false", - "-PbuildDir=%s" % self.output_dir, - "assembleDebug", - ], - title="Building Example " + self.identifier, - ) + self._Execute( + [ + "%s/examples/%s/android/App/gradlew" + % (self.root, self.app.ExampleName()), + "-p", + "%s/examples/%s/android/App/" % (self.root, + self.app.ExampleName()), + "-PmatterBuildSrcDir=%s" % self.output_dir, + "-PmatterSdkSourceBuild=false", + "-PbuildDir=%s" % self.output_dir, + "assembleDebug", + ], + title="Building Example " + self.identifier, + ) def generate(self): self._Execute( @@ -533,22 +518,6 @@ def _build(self): self.copyToExampleApp(jnilibs_dir, libs_dir, libs, jars) self.gradlewBuildExampleAndroid() - output_dir = os.path.join( - self.output_dir, "outputs", "apk" - ) - - self._Execute( - ["mkdir", "-p", output_dir], title="Prepare outputs directory" - ) - - apk_dir = os.path.join( - self.root, "examples", self.app.ExampleName(), "android/App/app/build/outputs/apk/debug" - ) - - self._Execute( - ["cp", "-f", "-r", apk_dir, output_dir], title="Copying outputs" - ) - if (self.profile != AndroidProfile.DEBUG): self.stripSymbols() @@ -573,6 +542,12 @@ def build_outputs(self): self.output_dir, "content-app", "outputs", "apk", "debug", "content-app-debug.apk" ) } + elif self.app == AndroidApp.VIRTUAL_DEVICE_APP: + outputs = { + self.app.AppName() + "app-debug.apk": os.path.join( + self.output_dir, "VirtualDeviceApp", "app", "outputs", "apk", "debug", "app-debug.apk" + ) + } else: outputs = { self.app.AppName() + "app-debug.apk": os.path.join( From 918fcfcf50b8cc3345dafa783361df443a453c22 Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Mon, 17 Jul 2023 18:40:21 +0900 Subject: [PATCH 29/36] virtual-device-app: Use out_dir from build script Signed-off-by: Jaehoon You Signed-off-by: Charles Kim --- examples/virtual-device-app/android/App/.gitignore | 1 - examples/virtual-device-app/android/App/app/.gitignore | 1 - examples/virtual-device-app/android/App/buildSrc/.gitignore | 1 - examples/virtual-device-app/android/App/core/common/.gitignore | 1 - examples/virtual-device-app/android/App/core/data/.gitignore | 1 - examples/virtual-device-app/android/App/core/domain/.gitignore | 1 - examples/virtual-device-app/android/App/core/matter/.gitignore | 1 - examples/virtual-device-app/android/App/core/model/.gitignore | 1 - examples/virtual-device-app/android/App/feature/main/.gitignore | 1 - .../virtual-device-app/android/App/feature/qrcode/.gitignore | 1 - examples/virtual-device-app/android/App/feature/setup/.gitignore | 1 - 11 files changed, 11 deletions(-) diff --git a/examples/virtual-device-app/android/App/.gitignore b/examples/virtual-device-app/android/App/.gitignore index ee24b62c6a6eb0..c9ad62ce32cf40 100644 --- a/examples/virtual-device-app/android/App/.gitignore +++ b/examples/virtual-device-app/android/App/.gitignore @@ -15,7 +15,6 @@ /.idea/assetWizardSettings.xml .idea/** .DS_Store -/build /captures .externalNativeBuild .cxx diff --git a/examples/virtual-device-app/android/App/app/.gitignore b/examples/virtual-device-app/android/App/app/.gitignore index 6f8a813f48dc4c..757fee31c9045c 100644 --- a/examples/virtual-device-app/android/App/app/.gitignore +++ b/examples/virtual-device-app/android/App/app/.gitignore @@ -1,2 +1 @@ -/build /.idea \ No newline at end of file diff --git a/examples/virtual-device-app/android/App/buildSrc/.gitignore b/examples/virtual-device-app/android/App/buildSrc/.gitignore index 42afabfd2abebf..e69de29bb2d1d6 100644 --- a/examples/virtual-device-app/android/App/buildSrc/.gitignore +++ b/examples/virtual-device-app/android/App/buildSrc/.gitignore @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/examples/virtual-device-app/android/App/core/common/.gitignore b/examples/virtual-device-app/android/App/core/common/.gitignore index 42afabfd2abebf..e69de29bb2d1d6 100644 --- a/examples/virtual-device-app/android/App/core/common/.gitignore +++ b/examples/virtual-device-app/android/App/core/common/.gitignore @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/examples/virtual-device-app/android/App/core/data/.gitignore b/examples/virtual-device-app/android/App/core/data/.gitignore index 42afabfd2abebf..e69de29bb2d1d6 100644 --- a/examples/virtual-device-app/android/App/core/data/.gitignore +++ b/examples/virtual-device-app/android/App/core/data/.gitignore @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/examples/virtual-device-app/android/App/core/domain/.gitignore b/examples/virtual-device-app/android/App/core/domain/.gitignore index 42afabfd2abebf..e69de29bb2d1d6 100644 --- a/examples/virtual-device-app/android/App/core/domain/.gitignore +++ b/examples/virtual-device-app/android/App/core/domain/.gitignore @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/examples/virtual-device-app/android/App/core/matter/.gitignore b/examples/virtual-device-app/android/App/core/matter/.gitignore index 42afabfd2abebf..e69de29bb2d1d6 100644 --- a/examples/virtual-device-app/android/App/core/matter/.gitignore +++ b/examples/virtual-device-app/android/App/core/matter/.gitignore @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/examples/virtual-device-app/android/App/core/model/.gitignore b/examples/virtual-device-app/android/App/core/model/.gitignore index 42afabfd2abebf..e69de29bb2d1d6 100644 --- a/examples/virtual-device-app/android/App/core/model/.gitignore +++ b/examples/virtual-device-app/android/App/core/model/.gitignore @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/examples/virtual-device-app/android/App/feature/main/.gitignore b/examples/virtual-device-app/android/App/feature/main/.gitignore index 42afabfd2abebf..e69de29bb2d1d6 100644 --- a/examples/virtual-device-app/android/App/feature/main/.gitignore +++ b/examples/virtual-device-app/android/App/feature/main/.gitignore @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/examples/virtual-device-app/android/App/feature/qrcode/.gitignore b/examples/virtual-device-app/android/App/feature/qrcode/.gitignore index 42afabfd2abebf..e69de29bb2d1d6 100644 --- a/examples/virtual-device-app/android/App/feature/qrcode/.gitignore +++ b/examples/virtual-device-app/android/App/feature/qrcode/.gitignore @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/examples/virtual-device-app/android/App/feature/setup/.gitignore b/examples/virtual-device-app/android/App/feature/setup/.gitignore index 42afabfd2abebf..e69de29bb2d1d6 100644 --- a/examples/virtual-device-app/android/App/feature/setup/.gitignore +++ b/examples/virtual-device-app/android/App/feature/setup/.gitignore @@ -1 +0,0 @@ -/build \ No newline at end of file From 2647e1be117decec0158c57685a2d51b6a7002d1 Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Mon, 17 Jul 2023 18:41:15 +0900 Subject: [PATCH 30/36] virtual-device-app: Remove unused chip args Signed-off-by: Jaehoon You Signed-off-by: Charles Kim --- examples/virtual-device-app/android/args.gni | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/virtual-device-app/android/args.gni b/examples/virtual-device-app/android/args.gni index c0afd7b1557a0d..392915e9c71fc9 100644 --- a/examples/virtual-device-app/android/args.gni +++ b/examples/virtual-device-app/android/args.gni @@ -24,6 +24,4 @@ chip_project_config_include_dirs = [ "${chip_root}/examples/virtual-device-app/virtual-device-common/include" ] chip_project_config_include_dirs += [ "${chip_root}/config/standalone" ] -chip_build_libshell = true - chip_config_network_layer_ble = true From 1a19a0626d1af1271e380dbbda2eed3057fe273c Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Mon, 17 Jul 2023 18:42:47 +0900 Subject: [PATCH 31/36] virtual-device-app: Update device config Signed-off-by: Jaehoon You Signed-off-by: Charles Kim --- .../virtual-device-common/include/CHIPProjectAppConfig.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/virtual-device-app/virtual-device-common/include/CHIPProjectAppConfig.h b/examples/virtual-device-app/virtual-device-common/include/CHIPProjectAppConfig.h index ffcb9137a3f541..baaeab39b590dc 100644 --- a/examples/virtual-device-app/virtual-device-common/include/CHIPProjectAppConfig.h +++ b/examples/virtual-device-app/virtual-device-common/include/CHIPProjectAppConfig.h @@ -37,8 +37,6 @@ #define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_TYPE 1 -#define CHIP_DEVICE_CONFIG_DEVICE_TYPE 0 // 0x0023 = 35 = Video Player - #define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID 0xFFF1 #define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DEVICE_NAME 1 From 9ea68f3a8841734a08b59993eef505fb72586393 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Mon, 17 Jul 2023 10:36:29 +0000 Subject: [PATCH 32/36] Restyled by google-java-format --- .../java/src/com/matter/virtual/device/app/OnOffManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/OnOffManager.java b/examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/OnOffManager.java index f4f87a28881273..d6ec0f2d56d543 100644 --- a/examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/OnOffManager.java +++ b/examples/virtual-device-app/android/java/src/com/matter/virtual/device/app/OnOffManager.java @@ -2,8 +2,7 @@ public interface OnOffManager { /** - * Notify that the OnOff value be changed by matter and should effect it. Note, - * set by TvApp will + * Notify that the OnOff value be changed by matter and should effect it. Note, set by TvApp will * also trigger this function, so must check if value is same * * @param value From 7aca097fa2ae24e081130b7a37e33979d0244dc6 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Mon, 17 Jul 2023 10:36:30 +0000 Subject: [PATCH 33/36] Restyled by clang-format --- .../android/java/ClusterChangeAttribute.cpp | 4 ++-- examples/virtual-device-app/android/java/DeviceApp-JNI.h | 2 +- examples/virtual-device-app/android/java/OnOffManager.cpp | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/virtual-device-app/android/java/ClusterChangeAttribute.cpp b/examples/virtual-device-app/android/java/ClusterChangeAttribute.cpp index 54e862dcd0dfe5..be16005ff089a1 100644 --- a/examples/virtual-device-app/android/java/ClusterChangeAttribute.cpp +++ b/examples/virtual-device-app/android/java/ClusterChangeAttribute.cpp @@ -41,8 +41,8 @@ static void OnOffClusterAttributeChangeCallback(const app::ConcreteAttributePath void MatterPostAttributeChangeCallback(const app::ConcreteAttributePath & attributePath, uint8_t type, uint16_t size, uint8_t * value) { - ChipLogProgress(Zcl, "[Device] clusterId:%d,attributeId:%d,endpoint:%d", attributePath.mClusterId, - attributePath.mAttributeId, static_cast(attributePath.mEndpointId)); + ChipLogProgress(Zcl, "[Device] clusterId:%d,attributeId:%d,endpoint:%d", attributePath.mClusterId, attributePath.mAttributeId, + static_cast(attributePath.mEndpointId)); switch (attributePath.mClusterId) { diff --git a/examples/virtual-device-app/android/java/DeviceApp-JNI.h b/examples/virtual-device-app/android/java/DeviceApp-JNI.h index c2372140f62de1..e6772a41b16902 100644 --- a/examples/virtual-device-app/android/java/DeviceApp-JNI.h +++ b/examples/virtual-device-app/android/java/DeviceApp-JNI.h @@ -31,7 +31,7 @@ class DeviceAppJNI friend DeviceAppJNI & DeviceAppJNIMgr(); static DeviceAppJNI sInstance; - jobject mDeviceAppObject = nullptr; + jobject mDeviceAppObject = nullptr; jmethodID mPostClusterInitMethod = nullptr; jmethodID mPostEventMethod = nullptr; }; diff --git a/examples/virtual-device-app/android/java/OnOffManager.cpp b/examples/virtual-device-app/android/java/OnOffManager.cpp index a18577598d7471..09d5265df8ab09 100644 --- a/examples/virtual-device-app/android/java/OnOffManager.cpp +++ b/examples/virtual-device-app/android/java/OnOffManager.cpp @@ -47,8 +47,7 @@ void OnOffManager::NewManager(jint endpoint, jobject manager) ChipLogProgress(Zcl, "Device App: OnOffManager::NewManager"); uint16_t ep = emberAfGetClusterServerEndpointIndex(static_cast(endpoint), app::Clusters::OnOff::Id, EMBER_AF_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT); - VerifyOrReturn(ep < kOnffManagerTableSize, - ChipLogError(Zcl, "Device App::OnOff::NewManager: endpoint %d not found", endpoint)); + VerifyOrReturn(ep < kOnffManagerTableSize, ChipLogError(Zcl, "Device App::OnOff::NewManager: endpoint %d not found", endpoint)); VerifyOrReturn(gOnOffManagerTable[ep] == nullptr, ChipLogError(Zcl, "Device App::OnOff::NewManager: endpoint %d already has a manager", endpoint)); From 0197ed677a72b8ed921efa2a259a9b782e53cd98 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Mon, 17 Jul 2023 10:36:31 +0000 Subject: [PATCH 34/36] Restyled by gn --- examples/virtual-device-app/android/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/virtual-device-app/android/BUILD.gn b/examples/virtual-device-app/android/BUILD.gn index 828856455c325f..9926574fcbf792 100644 --- a/examples/virtual-device-app/android/BUILD.gn +++ b/examples/virtual-device-app/android/BUILD.gn @@ -65,9 +65,9 @@ android_library("java") { sources = [ "java/src/com/matter/virtual/device/app/DACProvider.java", - "java/src/com/matter/virtual/device/app/OnOffManager.java", "java/src/com/matter/virtual/device/app/DeviceApp.java", "java/src/com/matter/virtual/device/app/DeviceAppCallback.java", + "java/src/com/matter/virtual/device/app/OnOffManager.java", ] javac_flags = [ "-Xlint:deprecation" ] From 92795680b8394116632c07445b7826d63bea9925 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Mon, 17 Jul 2023 10:36:33 +0000 Subject: [PATCH 35/36] Restyled by prettier-markdown --- examples/virtual-device-app/android/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/virtual-device-app/android/README.md b/examples/virtual-device-app/android/README.md index bad2cf1ebdf657..a5a1ce3a659008 100644 --- a/examples/virtual-device-app/android/README.md +++ b/examples/virtual-device-app/android/README.md @@ -51,8 +51,8 @@ the top Matter directory: See the table above for other values of `TARGET_CPU`. The debug Android package `app-debug.apk` will be generated at -`out/android-$TARGET_CPU-virtual-device-app/VirtualDeviceApp/app/outputs/apk/debug/`, and can be installed -with +`out/android-$TARGET_CPU-virtual-device-app/VirtualDeviceApp/app/outputs/apk/debug/`, +and can be installed with ```shell adb install out/android-$TARGET_CPU-virtual-device-app/VirtualDeviceApp/app/outputs/apk/debug/app-debug.apk From 92b317652f026592c4e169ec977de3caa68fce79 Mon Sep 17 00:00:00 2001 From: Jaehoon You Date: Wed, 19 Jul 2023 11:42:57 +0900 Subject: [PATCH 36/36] virtual-device-app: Change OnOff revision to 5 Signed-off-by: Jaehoon You Signed-off-by: Charles Kim --- .../virtual-device-common/virtual-device-app.matter | 3 ++- .../virtual-device-common/virtual-device-app.zap | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/virtual-device-app/virtual-device-common/virtual-device-app.matter b/examples/virtual-device-app/virtual-device-common/virtual-device-app.matter index 11b035c27cb997..d86ccf415c13aa 100644 --- a/examples/virtual-device-app/virtual-device-common/virtual-device-app.matter +++ b/examples/virtual-device-app/virtual-device-common/virtual-device-app.matter @@ -292,6 +292,7 @@ server cluster OnOff = 6 { bitmap Feature : BITMAP32 { kLighting = 0x1; + kDeadFront = 0x2; } bitmap OnOffControl : BITMAP8 { @@ -1908,7 +1909,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute attributeList; ram attribute featureMap default = 0; - ram attribute clusterRevision default = 4; + ram attribute clusterRevision default = 5; } server cluster Descriptor { diff --git a/examples/virtual-device-app/virtual-device-common/virtual-device-app.zap b/examples/virtual-device-app/virtual-device-common/virtual-device-app.zap index e871563315571b..939b94dae34954 100644 --- a/examples/virtual-device-app/virtual-device-common/virtual-device-app.zap +++ b/examples/virtual-device-app/virtual-device-common/virtual-device-app.zap @@ -552,7 +552,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "4", + "defaultValue": "5", "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -594,7 +594,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "4", + "defaultValue": "5", "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -7874,7 +7874,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "4", + "defaultValue": "5", "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -8044,7 +8044,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "4", + "defaultValue": "5", "reportable": 1, "minInterval": 0, "maxInterval": 65344,