diff --git a/examples/virtual-device-app/android/App/feature/closure/.gitignore b/examples/virtual-device-app/android/App/feature/closure/.gitignore
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/examples/virtual-device-app/android/App/feature/closure/build.gradle.kts b/examples/virtual-device-app/android/App/feature/closure/build.gradle.kts
new file mode 100644
index 00000000000000..455f2013f3935e
--- /dev/null
+++ b/examples/virtual-device-app/android/App/feature/closure/build.gradle.kts
@@ -0,0 +1,70 @@
+import com.matter.buildsrc.Deps
+import com.matter.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.matter.virtual.device.app.feature.closure"
+ 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:ui"))
+
+ implementation(Deps.AndroidX.core)
+ implementation(Deps.AndroidX.appcompat)
+ implementation(Deps.AndroidX.fragment)
+ implementation(Deps.AndroidX.Lifecycle.viewmodel)
+
+ 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/virtual-device-app/android/App/feature/closure/proguard-rules.pro b/examples/virtual-device-app/android/App/feature/closure/proguard-rules.pro
new file mode 100644
index 00000000000000..481bb434814107
--- /dev/null
+++ b/examples/virtual-device-app/android/App/feature/closure/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/virtual-device-app/android/App/feature/closure/src/androidTest/java/com/matter/virtual/device/app/feature/closure/ExampleInstrumentedTest.kt b/examples/virtual-device-app/android/App/feature/closure/src/androidTest/java/com/matter/virtual/device/app/feature/closure/ExampleInstrumentedTest.kt
new file mode 100644
index 00000000000000..5e4178d42aa18b
--- /dev/null
+++ b/examples/virtual-device-app/android/App/feature/closure/src/androidTest/java/com/matter/virtual/device/app/feature/closure/ExampleInstrumentedTest.kt
@@ -0,0 +1,22 @@
+package com.matter.virtual.device.app.feature.closure
+
+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.closure.test", appContext.packageName)
+ }
+}
diff --git a/examples/virtual-device-app/android/App/feature/closure/src/main/AndroidManifest.xml b/examples/virtual-device-app/android/App/feature/closure/src/main/AndroidManifest.xml
new file mode 100644
index 00000000000000..a5918e68abcdde
--- /dev/null
+++ b/examples/virtual-device-app/android/App/feature/closure/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/examples/virtual-device-app/android/App/feature/closure/src/main/java/com/matter/virtual/device/app/feature/closure/DoorLockFragment.kt b/examples/virtual-device-app/android/App/feature/closure/src/main/java/com/matter/virtual/device/app/feature/closure/DoorLockFragment.kt
new file mode 100644
index 00000000000000..8cfe6a403f53ed
--- /dev/null
+++ b/examples/virtual-device-app/android/App/feature/closure/src/main/java/com/matter/virtual/device/app/feature/closure/DoorLockFragment.kt
@@ -0,0 +1,41 @@
+package com.matter.virtual.device.app.feature.closure
+
+import androidx.fragment.app.viewModels
+import androidx.navigation.fragment.navArgs
+import com.matter.virtual.device.app.core.ui.BaseFragment
+import com.matter.virtual.device.app.core.ui.databinding.LayoutAppbarBinding
+import com.matter.virtual.device.app.feature.closure.databinding.FragmentDoorLockBinding
+import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.serialization.ExperimentalSerializationApi
+import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.json.Json
+import timber.log.Timber
+
+@AndroidEntryPoint
+class DoorLockFragment :
+ BaseFragment(R.layout.fragment_door_lock) {
+
+ override val viewModel: DoorLockViewModel by viewModels()
+
+ @OptIn(ExperimentalSerializationApi::class)
+ override fun setupNavArgs() {
+ val args: DoorLockFragmentArgs by navArgs()
+ matterSettings = Json.decodeFromString(args.setting)
+ }
+
+ override fun setupAppbar(): LayoutAppbarBinding = binding.appbar
+
+ override fun setupUi() {}
+
+ override fun setupObservers() {}
+
+ override fun onResume() {
+ Timber.d("onResume()")
+ super.onResume()
+ }
+
+ override fun onDestroy() {
+ Timber.d("onDestroy()")
+ super.onDestroy()
+ }
+}
diff --git a/examples/virtual-device-app/android/App/feature/closure/src/main/java/com/matter/virtual/device/app/feature/closure/DoorLockViewModel.kt b/examples/virtual-device-app/android/App/feature/closure/src/main/java/com/matter/virtual/device/app/feature/closure/DoorLockViewModel.kt
new file mode 100644
index 00000000000000..35a9a19ff634f4
--- /dev/null
+++ b/examples/virtual-device-app/android/App/feature/closure/src/main/java/com/matter/virtual/device/app/feature/closure/DoorLockViewModel.kt
@@ -0,0 +1,17 @@
+package com.matter.virtual.device.app.feature.closure
+
+import androidx.lifecycle.SavedStateHandle
+import com.matter.virtual.device.app.core.ui.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+import timber.log.Timber
+
+@HiltViewModel
+class DoorLockViewModel @Inject constructor(savedStateHandle: SavedStateHandle) :
+ BaseViewModel(savedStateHandle) {
+
+ override fun onCleared() {
+ Timber.d("onCleared()")
+ super.onCleared()
+ }
+}
diff --git a/examples/virtual-device-app/android/App/feature/closure/src/main/res/layout/fragment_door_lock.xml b/examples/virtual-device-app/android/App/feature/closure/src/main/res/layout/fragment_door_lock.xml
new file mode 100644
index 00000000000000..d726e82e616348
--- /dev/null
+++ b/examples/virtual-device-app/android/App/feature/closure/src/main/res/layout/fragment_door_lock.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/virtual-device-app/android/App/feature/closure/src/main/res/navigation/closure_nav_graph.xml b/examples/virtual-device-app/android/App/feature/closure/src/main/res/navigation/closure_nav_graph.xml
new file mode 100644
index 00000000000000..d56b030dc252a8
--- /dev/null
+++ b/examples/virtual-device-app/android/App/feature/closure/src/main/res/navigation/closure_nav_graph.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/virtual-device-app/android/App/feature/closure/src/test/java/com/matter/virtual/device/app/feature/closure/ExampleUnitTest.kt b/examples/virtual-device-app/android/App/feature/closure/src/test/java/com/matter/virtual/device/app/feature/closure/ExampleUnitTest.kt
new file mode 100644
index 00000000000000..13c92b81c9b741
--- /dev/null
+++ b/examples/virtual-device-app/android/App/feature/closure/src/test/java/com/matter/virtual/device/app/feature/closure/ExampleUnitTest.kt
@@ -0,0 +1,16 @@
+package com.matter.virtual.device.app.feature.closure
+
+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/virtual-device-app/android/App/settings.gradle.kts b/examples/virtual-device-app/android/App/settings.gradle.kts
index a1bded5ee3a6b0..5bdf9465c3abb8 100644
--- a/examples/virtual-device-app/android/App/settings.gradle.kts
+++ b/examples/virtual-device-app/android/App/settings.gradle.kts
@@ -21,6 +21,7 @@ include(":core:matter")
include(":core:model")
include(":core:ui")
include(":feature:control")
+include(":feature:closure")
include(":feature:main")
include(":feature:qrcode")
include(":feature:setup")