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")