From 3d431892626292042af9a76ff943252f17d6087c Mon Sep 17 00:00:00 2001 From: Ekaterina Leonidova Date: Sun, 2 Feb 2025 19:00:51 +0300 Subject: [PATCH 1/4] homework 15 (MVVM + DI) --- app/build.gradle | 10 ++ app/src/main/AndroidManifest.xml | 3 + .../java/ru/otus/basicarchitecture/HiltApp.kt | 11 +++ .../ru/otus/basicarchitecture/MainActivity.kt | 10 ++ .../otus/basicarchitecture/data/TagsList.kt | 14 +++ .../basicarchitecture/data/WizardCache.kt | 15 +++ .../presentation/AddressFragment.kt | 95 ++++++++++++++++++ .../presentation/AddressViewModel.kt | 19 ++++ .../presentation/PersonalDataFragment.kt | 98 +++++++++++++++++++ .../presentation/PersonalDataViewModel.kt | 19 ++++ .../presentation/SummaryFragment.kt | 45 +++++++++ .../presentation/SummaryViewModel.kt | 16 +++ .../presentation/TagsFragment.kt | 53 ++++++++++ .../presentation/TagsViewModel.kt | 31 ++++++ .../ru/otus/basicarchitecture/utils/Utils.kt | 8 ++ app/src/main/res/layout/activity_main.xml | 8 +- app/src/main/res/layout/fragment_address.xml | 76 ++++++++++++++ .../res/layout/fragment_personal_data.xml | 77 +++++++++++++++ app/src/main/res/layout/fragment_summary.xml | 76 ++++++++++++++ app/src/main/res/layout/fragment_tags.xml | 28 ++++++ app/src/main/res/values-night/themes.xml | 2 +- app/src/main/res/values/strings.xml | 9 ++ app/src/main/res/values/themes.xml | 2 +- build.gradle | 6 +- 24 files changed, 725 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/ru/otus/basicarchitecture/HiltApp.kt create mode 100644 app/src/main/java/ru/otus/basicarchitecture/data/TagsList.kt create mode 100644 app/src/main/java/ru/otus/basicarchitecture/data/WizardCache.kt create mode 100644 app/src/main/java/ru/otus/basicarchitecture/presentation/AddressFragment.kt create mode 100644 app/src/main/java/ru/otus/basicarchitecture/presentation/AddressViewModel.kt create mode 100644 app/src/main/java/ru/otus/basicarchitecture/presentation/PersonalDataFragment.kt create mode 100644 app/src/main/java/ru/otus/basicarchitecture/presentation/PersonalDataViewModel.kt create mode 100644 app/src/main/java/ru/otus/basicarchitecture/presentation/SummaryFragment.kt create mode 100644 app/src/main/java/ru/otus/basicarchitecture/presentation/SummaryViewModel.kt create mode 100644 app/src/main/java/ru/otus/basicarchitecture/presentation/TagsFragment.kt create mode 100644 app/src/main/java/ru/otus/basicarchitecture/presentation/TagsViewModel.kt create mode 100644 app/src/main/java/ru/otus/basicarchitecture/utils/Utils.kt create mode 100644 app/src/main/res/layout/fragment_address.xml create mode 100644 app/src/main/res/layout/fragment_personal_data.xml create mode 100644 app/src/main/res/layout/fragment_summary.xml create mode 100644 app/src/main/res/layout/fragment_tags.xml diff --git a/app/build.gradle b/app/build.gradle index e515992..8c339ec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,8 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' + id 'com.google.devtools.ksp' + id 'com.google.dagger.hilt.android' } android { @@ -38,7 +40,15 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.7.0' implementation 'com.google.android.material:material:1.12.0' implementation 'androidx.constraintlayout:constraintlayout:2.2.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.8.7' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7' + implementation 'androidx.fragment:fragment-ktx:1.8.5' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.2.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.7' + + implementation "com.google.dagger:hilt-android:2.53" + ksp "com.google.dagger:hilt-compiler:2.53" } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ea17fa5..22e5df3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,7 +2,10 @@ + + = listOf() +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/basicarchitecture/presentation/AddressFragment.kt b/app/src/main/java/ru/otus/basicarchitecture/presentation/AddressFragment.kt new file mode 100644 index 0000000..e41883f --- /dev/null +++ b/app/src/main/java/ru/otus/basicarchitecture/presentation/AddressFragment.kt @@ -0,0 +1,95 @@ +package ru.otus.basicarchitecture.presentation + +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import androidx.fragment.app.Fragment +import com.google.android.material.textfield.TextInputEditText +import dagger.hilt.android.AndroidEntryPoint +import ru.otus.basicarchitecture.R +import javax.inject.Inject + +@AndroidEntryPoint +class AddressFragment : Fragment() { + + @Inject + lateinit var viewModel: AddressViewModel + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + return inflater.inflate(R.layout.fragment_address, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + view.findViewById(R.id.country) + .addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(s: Editable?) {} + + override fun beforeTextChanged( + s: CharSequence?, + start: Int, + count: Int, + after: Int + ) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + viewModel.country.value = s.toString() + } + }) + + view.findViewById(R.id.city) + .addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(s: Editable?) {} + + override fun beforeTextChanged( + s: CharSequence?, + start: Int, + count: Int, + after: Int + ) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + viewModel.city.value = s.toString() + } + }) + + view.findViewById(R.id.address) + .addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(s: Editable?) {} + + override fun beforeTextChanged( + s: CharSequence?, + start: Int, + count: Int, + after: Int + ) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + viewModel.address.value = s.toString() + } + }) + + + + view.findViewById