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 @@ - +