From 9a7ab873fe87ff549cf2715a6605512b2a4bfc07 Mon Sep 17 00:00:00 2001
From: t-o-n-y-p <42129780+t-o-n-y-p@users.noreply.github.com>
Date: Sat, 20 Jan 2024 19:19:27 +0300
Subject: [PATCH 1/3] implemented architecture
---
app/build.gradle | 16 ++-
.../ExampleInstrumentedTest.kt | 6 +-
app/src/main/AndroidManifest.xml | 10 +-
.../ru/otus/basicarchitecture/MainActivity.kt | 4 +-
.../ru/otus/basicarchitecture/WizardCache.kt | 16 +++
.../address/AddressFragment.kt | 34 +++++++
.../address/AddressUseCase.kt | 8 ++
.../address/AddressViewModel.kt | 13 +++
.../ru/otus/basicarchitecture/application.kt | 24 +++++
.../interests/InterestsFragment.kt | 34 +++++++
.../interests/InterestsUseCase.kt | 15 +++
.../interests/InterestsViewModel.kt | 46 +++++++++
.../personal/PersonalDataFragment.kt | 48 +++++++++
.../personal/PersonalDataUseCase.kt | 13 +++
.../personal/PersonalDataViewModel.kt | 33 +++++++
.../service/InterestsService.kt | 7 ++
.../service/impl/InterestsServiceStubImpl.kt | 10 ++
.../summary/SummaryFragment.kt | 26 +++++
.../summary/SummaryUseCase.kt | 8 ++
.../summary/SummaryViewModel.kt | 13 +++
app/src/main/res/layout/activity_main.xml | 8 ++
app/src/main/res/layout/address_fragment.xml | 83 ++++++++++++++++
.../main/res/layout/interests_fragment.xml | 34 +++++++
.../res/layout/personal_data_fragment.xml | 86 ++++++++++++++++
app/src/main/res/layout/summary_fragment.xml | 97 +++++++++++++++++++
app/src/main/res/navigation/navigation.xml | 37 +++++++
app/src/main/res/values-night/themes.xml | 2 +-
.../otus/basicarchitecture/ExampleUnitTest.kt | 3 +-
build.gradle | 3 +-
29 files changed, 723 insertions(+), 14 deletions(-)
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/WizardCache.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/address/AddressFragment.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/address/AddressUseCase.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/address/AddressViewModel.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/application.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/interests/InterestsFragment.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/interests/InterestsUseCase.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/interests/InterestsViewModel.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/personal/PersonalDataFragment.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/personal/PersonalDataUseCase.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/personal/PersonalDataViewModel.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/service/InterestsService.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/service/impl/InterestsServiceStubImpl.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/summary/SummaryFragment.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/summary/SummaryUseCase.kt
create mode 100644 app/src/main/java/ru/otus/basicarchitecture/summary/SummaryViewModel.kt
create mode 100644 app/src/main/res/layout/address_fragment.xml
create mode 100644 app/src/main/res/layout/interests_fragment.xml
create mode 100644 app/src/main/res/layout/personal_data_fragment.xml
create mode 100644 app/src/main/res/layout/summary_fragment.xml
create mode 100644 app/src/main/res/navigation/navigation.xml
diff --git a/app/build.gradle b/app/build.gradle
index 9c99d98..41a8ca9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,15 +1,17 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
+ id 'org.jetbrains.kotlin.kapt'
+ id 'com.google.dagger.hilt.android'
}
android {
namespace 'ru.otus.basicarchitecture'
- compileSdk 33
+ compileSdk 34
defaultConfig {
applicationId "ru.otus.basicarchitecture"
- minSdk 24
+ minSdk 26
targetSdk 33
versionCode 1
versionName "1.0"
@@ -30,14 +32,22 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}
+ buildFeatures {
+ viewBinding true
+ }
}
dependencies {
- implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+ implementation 'com.google.dagger:hilt-android:2.50'
+ implementation 'androidx.navigation:navigation-fragment-ktx:2.7.6'
+ implementation 'androidx.navigation:navigation-ui-ktx:2.7.6'
+ kapt 'com.google.dagger:hilt-compiler:2.50'
+
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
diff --git a/app/src/androidTest/java/ru/otus/basicarchitecture/ExampleInstrumentedTest.kt b/app/src/androidTest/java/ru/otus/basicarchitecture/ExampleInstrumentedTest.kt
index a987f13..0a180ff 100644
--- a/app/src/androidTest/java/ru/otus/basicarchitecture/ExampleInstrumentedTest.kt
+++ b/app/src/androidTest/java/ru/otus/basicarchitecture/ExampleInstrumentedTest.kt
@@ -1,13 +1,11 @@
package ru.otus.basicarchitecture
-import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
-
+import androidx.test.platform.app.InstrumentationRegistry
+import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
-import org.junit.Assert.*
-
/**
* Instrumented test, which will execute on an Android device.
*
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1e81fea..1789d51 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,10 +11,16 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.BasicArchitecture"
- tools:targetApi="31">
+ tools:targetApi="31"
+ android:name=".BasicArchitectureApplication">
+ android:exported="true">
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/MainActivity.kt b/app/src/main/java/ru/otus/basicarchitecture/MainActivity.kt
index 623aba9..85a6d42 100644
--- a/app/src/main/java/ru/otus/basicarchitecture/MainActivity.kt
+++ b/app/src/main/java/ru/otus/basicarchitecture/MainActivity.kt
@@ -1,8 +1,10 @@
package ru.otus.basicarchitecture
-import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
diff --git a/app/src/main/java/ru/otus/basicarchitecture/WizardCache.kt b/app/src/main/java/ru/otus/basicarchitecture/WizardCache.kt
new file mode 100644
index 0000000..f48d2d0
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/WizardCache.kt
@@ -0,0 +1,16 @@
+package ru.otus.basicarchitecture
+
+import dagger.hilt.android.scopes.ActivityRetainedScoped
+import java.time.LocalDate
+import javax.inject.Inject
+
+@ActivityRetainedScoped
+class WizardCache @Inject constructor() {
+ var firstName: String = ""
+ var lastName: String? = ""
+ var birthDate: LocalDate = LocalDate.now().minusYears(18)
+ var country: String = ""
+ var city: String = ""
+ var address: String = ""
+ var interests: MutableList = mutableListOf()
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/address/AddressFragment.kt b/app/src/main/java/ru/otus/basicarchitecture/address/AddressFragment.kt
new file mode 100644
index 0000000..9d00c56
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/address/AddressFragment.kt
@@ -0,0 +1,34 @@
+package ru.otus.basicarchitecture.address
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+import dagger.hilt.android.AndroidEntryPoint
+import ru.otus.basicarchitecture.R
+import ru.otus.basicarchitecture.databinding.AddressFragmentBinding
+
+@AndroidEntryPoint
+class AddressFragment : Fragment(R.layout.address_fragment) {
+
+ private lateinit var binding: AddressFragmentBinding
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ binding = AddressFragmentBinding.inflate(inflater)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ binding.nextButton.setOnClickListener {
+ findNavController().navigate(R.id.addressNext)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/address/AddressUseCase.kt b/app/src/main/java/ru/otus/basicarchitecture/address/AddressUseCase.kt
new file mode 100644
index 0000000..5e857d7
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/address/AddressUseCase.kt
@@ -0,0 +1,8 @@
+package ru.otus.basicarchitecture.address
+
+import dagger.hilt.android.scopes.ViewModelScoped
+import javax.inject.Inject
+
+@ViewModelScoped
+class AddressUseCase @Inject constructor() {
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/address/AddressViewModel.kt b/app/src/main/java/ru/otus/basicarchitecture/address/AddressViewModel.kt
new file mode 100644
index 0000000..04853bb
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/address/AddressViewModel.kt
@@ -0,0 +1,13 @@
+package ru.otus.basicarchitecture.address
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import ru.otus.basicarchitecture.WizardCache
+import javax.inject.Inject
+
+@HiltViewModel
+class AddressViewModel @Inject constructor(
+ val useCase: AddressUseCase,
+ val cache: WizardCache
+) : ViewModel() {
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/application.kt b/app/src/main/java/ru/otus/basicarchitecture/application.kt
new file mode 100644
index 0000000..ec8ab6c
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/application.kt
@@ -0,0 +1,24 @@
+package ru.otus.basicarchitecture
+
+import android.app.Application
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.android.HiltAndroidApp
+import dagger.hilt.components.SingletonComponent
+import ru.otus.basicarchitecture.service.InterestsService
+import ru.otus.basicarchitecture.service.impl.InterestsServiceStubImpl
+import javax.inject.Singleton
+
+@HiltAndroidApp
+class BasicArchitectureApplication : Application()
+
+@Module
+@InstallIn(SingletonComponent::class)
+class Module {
+
+ @Provides
+ @Singleton
+ fun interestsService(): InterestsService = InterestsServiceStubImpl()
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/interests/InterestsFragment.kt b/app/src/main/java/ru/otus/basicarchitecture/interests/InterestsFragment.kt
new file mode 100644
index 0000000..e78527b
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/interests/InterestsFragment.kt
@@ -0,0 +1,34 @@
+package ru.otus.basicarchitecture.interests
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+import dagger.hilt.android.AndroidEntryPoint
+import ru.otus.basicarchitecture.R
+import ru.otus.basicarchitecture.databinding.InterestsFragmentBinding
+
+@AndroidEntryPoint
+class InterestsFragment : Fragment(R.layout.interests_fragment) {
+
+ private lateinit var binding: InterestsFragmentBinding
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ binding = InterestsFragmentBinding.inflate(inflater)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ binding.nextButton.setOnClickListener {
+ findNavController().navigate(R.id.interestsNext)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/interests/InterestsUseCase.kt b/app/src/main/java/ru/otus/basicarchitecture/interests/InterestsUseCase.kt
new file mode 100644
index 0000000..ed244c8
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/interests/InterestsUseCase.kt
@@ -0,0 +1,15 @@
+package ru.otus.basicarchitecture.interests
+
+import dagger.hilt.android.scopes.ViewModelScoped
+import ru.otus.basicarchitecture.service.InterestsService
+import javax.inject.Inject
+
+@ViewModelScoped
+class InterestsUseCase @Inject constructor() {
+
+ @Inject
+ lateinit var interestsService: InterestsService
+
+ suspend fun getAvailableInterests(): List = interestsService.getAvailableInterests()
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/interests/InterestsViewModel.kt b/app/src/main/java/ru/otus/basicarchitecture/interests/InterestsViewModel.kt
new file mode 100644
index 0000000..6fa7860
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/interests/InterestsViewModel.kt
@@ -0,0 +1,46 @@
+package ru.otus.basicarchitecture.interests
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import ru.otus.basicarchitecture.WizardCache
+import javax.inject.Inject
+
+@HiltViewModel
+class InterestsViewModel @Inject constructor(
+ val useCase: InterestsUseCase,
+ val cache: WizardCache
+) : ViewModel() {
+
+ private val mInterestsGroupState = MutableLiveData(InterestsGroupState.NotSet)
+ val interestsGroupState: LiveData get() = mInterestsGroupState
+
+ fun loadAvailableInterests() = viewModelScope.launch {
+ mInterestsGroupState.value = InterestsGroupState.Loading
+ try {
+ val interests = withContext(Dispatchers.IO) {
+ useCase.getAvailableInterests()
+ }
+ mInterestsGroupState.value = InterestsGroupState.Content(interests)
+ } catch (t: Throwable) {
+ mInterestsGroupState.value = InterestsGroupState.NotSet
+ }
+ }
+
+
+
+ sealed class InterestsGroupState {
+
+ data object NotSet: InterestsGroupState()
+
+ data object Loading: InterestsGroupState()
+
+ data class Content(val value: List): InterestsGroupState()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/personal/PersonalDataFragment.kt b/app/src/main/java/ru/otus/basicarchitecture/personal/PersonalDataFragment.kt
new file mode 100644
index 0000000..da03618
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/personal/PersonalDataFragment.kt
@@ -0,0 +1,48 @@
+package ru.otus.basicarchitecture.personal
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.widget.addTextChangedListener
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.navigation.fragment.findNavController
+import dagger.hilt.android.AndroidEntryPoint
+import ru.otus.basicarchitecture.R
+import ru.otus.basicarchitecture.databinding.PersonalDataFragmentBinding
+import java.time.format.DateTimeFormatter
+
+@AndroidEntryPoint
+class PersonalDataFragment : Fragment(R.layout.personal_data_fragment) {
+
+ private lateinit var binding: PersonalDataFragmentBinding
+ private val viewModel: PersonalDataViewModel by viewModels()
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ binding = PersonalDataFragmentBinding.inflate(inflater)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ viewModel.nextButtonState.observe(viewLifecycleOwner) {
+ binding.nextButton.isEnabled = it
+ }
+ binding.dateField.addTextChangedListener {
+ viewModel.validateBirthDate(it?.toString())
+ }
+ binding.firstNameField.setText(viewModel.cache.firstName)
+ binding.lastNameField.setText(viewModel.cache.lastName)
+ binding.dateField.setText(
+ viewModel.cache.birthDate.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")))
+ binding.nextButton.setOnClickListener {
+ findNavController().navigate(R.id.personalDataNext)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/personal/PersonalDataUseCase.kt b/app/src/main/java/ru/otus/basicarchitecture/personal/PersonalDataUseCase.kt
new file mode 100644
index 0000000..fade996
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/personal/PersonalDataUseCase.kt
@@ -0,0 +1,13 @@
+package ru.otus.basicarchitecture.personal
+
+import dagger.hilt.android.scopes.ViewModelScoped
+import java.time.LocalDate
+import javax.inject.Inject
+
+@ViewModelScoped
+class PersonalDataUseCase @Inject constructor() {
+
+ fun isBirthDateValid(date: LocalDate) =
+ !date.isAfter(LocalDate.now().minusYears(18))
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/personal/PersonalDataViewModel.kt b/app/src/main/java/ru/otus/basicarchitecture/personal/PersonalDataViewModel.kt
new file mode 100644
index 0000000..8603917
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/personal/PersonalDataViewModel.kt
@@ -0,0 +1,33 @@
+package ru.otus.basicarchitecture.personal
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import ru.otus.basicarchitecture.WizardCache
+import java.time.LocalDate
+import java.time.format.DateTimeFormatter
+import java.time.format.DateTimeParseException
+import javax.inject.Inject
+
+@HiltViewModel
+class PersonalDataViewModel @Inject constructor(
+ private val useCase: PersonalDataUseCase,
+ val cache: WizardCache
+) : ViewModel() {
+
+ private val mNextButtonState = MutableLiveData(false)
+ val nextButtonState: LiveData get() = mNextButtonState
+
+ fun validateBirthDate(date: String?) {
+ try {
+ mNextButtonState.value =
+ date?.let { useCase.isBirthDateValid(
+ LocalDate.parse(it, DateTimeFormatter.ofPattern("dd.MM.yyyy")))
+ } ?: false
+ } catch (e: DateTimeParseException) {
+ mNextButtonState.value = false
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/service/InterestsService.kt b/app/src/main/java/ru/otus/basicarchitecture/service/InterestsService.kt
new file mode 100644
index 0000000..1e05d44
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/service/InterestsService.kt
@@ -0,0 +1,7 @@
+package ru.otus.basicarchitecture.service
+
+interface InterestsService {
+
+ suspend fun getAvailableInterests(): List
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/service/impl/InterestsServiceStubImpl.kt b/app/src/main/java/ru/otus/basicarchitecture/service/impl/InterestsServiceStubImpl.kt
new file mode 100644
index 0000000..5279cac
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/service/impl/InterestsServiceStubImpl.kt
@@ -0,0 +1,10 @@
+package ru.otus.basicarchitecture.service.impl
+
+import ru.otus.basicarchitecture.service.InterestsService
+
+class InterestsServiceStubImpl : InterestsService {
+
+ override suspend fun getAvailableInterests(): List = listOf(
+ "Cooking", "Hiking", "Programming", "Travelling", "Sleeping"
+ )
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/summary/SummaryFragment.kt b/app/src/main/java/ru/otus/basicarchitecture/summary/SummaryFragment.kt
new file mode 100644
index 0000000..d9b4ede
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/summary/SummaryFragment.kt
@@ -0,0 +1,26 @@
+package ru.otus.basicarchitecture.summary
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import dagger.hilt.android.AndroidEntryPoint
+import ru.otus.basicarchitecture.R
+import ru.otus.basicarchitecture.databinding.InterestsFragmentBinding
+
+@AndroidEntryPoint
+class SummaryFragment : Fragment(R.layout.summary_fragment) {
+
+ private lateinit var binding: InterestsFragmentBinding
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ binding = InterestsFragmentBinding.inflate(inflater)
+ return binding.root
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/summary/SummaryUseCase.kt b/app/src/main/java/ru/otus/basicarchitecture/summary/SummaryUseCase.kt
new file mode 100644
index 0000000..bdca13f
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/summary/SummaryUseCase.kt
@@ -0,0 +1,8 @@
+package ru.otus.basicarchitecture.summary
+
+import dagger.hilt.android.scopes.ViewModelScoped
+import javax.inject.Inject
+
+@ViewModelScoped
+class SummaryUseCase @Inject constructor() {
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/otus/basicarchitecture/summary/SummaryViewModel.kt b/app/src/main/java/ru/otus/basicarchitecture/summary/SummaryViewModel.kt
new file mode 100644
index 0000000..91a728f
--- /dev/null
+++ b/app/src/main/java/ru/otus/basicarchitecture/summary/SummaryViewModel.kt
@@ -0,0 +1,13 @@
+package ru.otus.basicarchitecture.summary
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import ru.otus.basicarchitecture.WizardCache
+import javax.inject.Inject
+
+@HiltViewModel
+class SummaryViewModel @Inject constructor(
+ val useCase: SummaryUseCase,
+ val cache: WizardCache
+) : ViewModel() {
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 0b15a20..bbbca8d 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -6,4 +6,12 @@
android:layout_height="match_parent"
tools:context=".MainActivity">
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/address_fragment.xml b/app/src/main/res/layout/address_fragment.xml
new file mode 100644
index 0000000..ea37c38
--- /dev/null
+++ b/app/src/main/res/layout/address_fragment.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/interests_fragment.xml b/app/src/main/res/layout/interests_fragment.xml
new file mode 100644
index 0000000..a6baa65
--- /dev/null
+++ b/app/src/main/res/layout/interests_fragment.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/personal_data_fragment.xml b/app/src/main/res/layout/personal_data_fragment.xml
new file mode 100644
index 0000000..d6dd06f
--- /dev/null
+++ b/app/src/main/res/layout/personal_data_fragment.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/summary_fragment.xml b/app/src/main/res/layout/summary_fragment.xml
new file mode 100644
index 0000000..74e5d22
--- /dev/null
+++ b/app/src/main/res/layout/summary_fragment.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/navigation/navigation.xml b/app/src/main/res/navigation/navigation.xml
new file mode 100644
index 0000000..0aa9b3a
--- /dev/null
+++ b/app/src/main/res/navigation/navigation.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index bbaa36f..b3d6383 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -1,4 +1,4 @@
-
+