Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 41 additions & 6 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'com.google.dagger.hilt.android'
id 'kotlin-kapt'

}

android {
namespace 'ru.otus.basicarchitecture'
compileSdk 33

hilt {
enableAggregatingTask = true
}
defaultConfig {
applicationId "ru.otus.basicarchitecture"
minSdk 24
Expand All @@ -24,21 +29,51 @@ android {
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '1.8'
jvmTarget = '17'
}

buildFeatures {
dataBinding true
viewBinding true
}
}

dependencies {

implementation 'androidx.core:core-ktx:1.8.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
implementation 'androidx.databinding:databinding-runtime:8.1.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.legacy:legacy-support-core-utils:1.0.0'
implementation("androidx.navigation:navigation-fragment:2.6.0")
implementation("androidx.navigation:navigation-ui:2.6.0")
implementation("androidx.navigation:navigation-fragment-ktx:2.6.0")
implementation("androidx.navigation:navigation-ui-ktx:2.6.0")
implementation("androidx.navigation:navigation-dynamic-features-fragment:2.6.0")
androidTestImplementation("androidx.navigation:navigation-testing:2.6.0")
implementation 'androidx.core:core-ktx:1.10.1'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
implementation 'com.google.dagger:hilt-android:2.46.1'
kapt 'com.google.dagger:hilt-compiler:2.46.1'

implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-moshi:2.9.0"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1"
implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0"
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
implementation "com.squareup.okhttp3:logging-interceptor:3.12.6"
implementation 'com.google.code.gson:gson:2.9.1'
}


13 changes: 10 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,20 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:name=".MyApp"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.BasicArchitecture"
tools:targetApi="31">
tools:targetApi="33">
<activity
android:name=".MainActivity"
android:exported="false" />
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
72 changes: 72 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/AddressFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package ru.otus.basicarchitecture
import android.os.Build
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.databinding.FragmentAddressBinding
import androidx.navigation.fragment.findNavController
import ru.otus.basicarchitecture.viewmodel.AddressViewModel
import androidx.fragment.app.viewModels

import android.text.Editable
import android.text.TextWatcher
import android.widget.ArrayAdapter
import ru.otus.basicarchitecture.model.AddressService
import ru.otus.basicarchitecture.model.AddressValue
import java.util.stream.Collectors

@AndroidEntryPoint
class AddressFragment : Fragment(R.layout.fragment_address) {
private lateinit var binding: FragmentAddressBinding
private val viewModel : AddressViewModel by viewModels()
private val service = AddressService()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentAddressBinding.inflate(inflater)
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.fullAddress.addTextChangedListener(object: TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(editable: Editable?) {
viewModel.search(editable.toString())
}
})

viewModel.getResultAddressLive().observe(viewLifecycleOwner) {
if(it!=null) {
val list = it.stream().map(AddressValue::value).collect(Collectors.toList())
val adapter = ArrayAdapter<String>(
requireContext(),
android.R.layout.simple_list_item_1,
list
)
binding.fullAddress.setAdapter(adapter)
}
}

binding.next.setOnClickListener() {
viewModel.saveData(binding.fullAddress.text.toString())
findNavController().navigate(R.id.action_addressFragment_to_interestsFragment)
}

}

override fun onDestroyView() {
super.onDestroyView()
viewModel.cancel()
}
}
21 changes: 21 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/DateMask.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ru.otus.basicarchitecture

import android.os.Build
import android.text.Editable
import android.text.TextWatcher
import androidx.annotation.RequiresApi
import ru.otus.basicarchitecture.viewmodel.UserViewModel

class DateMask(var vm: UserViewModel) :TextWatcher {
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
// TODO("Not yet implemented")
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
//TODO("Not yet implemented")
}
@RequiresApi(Build.VERSION_CODES.O)
override fun afterTextChanged(editable: Editable?) {
vm.onDateChanged(editable)
}

}
60 changes: 60 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/InterestsFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package ru.otus.basicarchitecture

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.databinding.FragmentInterestsBinding
import androidx.navigation.fragment.findNavController
import ru.otus.basicarchitecture.viewmodel.InterestsViewModel
import com.google.android.material.chip.Chip
import java.util.stream.Collectors
import androidx.fragment.app.viewModels

@AndroidEntryPoint
class InterestsFragment : Fragment(R.layout.fragment_interests) {

private lateinit var binding: FragmentInterestsBinding
private val viewModel: InterestsViewModel by viewModels()

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentInterestsBinding.inflate(inflater)
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.next.setOnClickListener() {
val tags = binding.tagGroup
var interests = tags.checkedChipIds.stream()
.map { id -> tags.findViewById<Chip>(id) }
.map { chip -> chip.text.toString() }
.collect(Collectors.toList())

viewModel.saveData(interests)

findNavController().navigate(R.id.action_interestsFragment_to_resultFragment)
}

viewModel.loadData()

viewModel.getResultInterestsLive().observe(viewLifecycleOwner) {
val tags = binding.tagGroup
it?.forEach { tag ->
val chip = Chip(tags.context)
chip.text= tag
chip.isClickable = true
chip.isCheckable = true
chip.textSize = 25F
tags.addView(chip)
}
}

}
}
21 changes: 20 additions & 1 deletion app/src/main/java/ru/otus/basicarchitecture/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,29 @@ package ru.otus.basicarchitecture

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupActionBarWithNavController
import dagger.hilt.android.AndroidEntryPoint
import ru.otus.basicarchitecture.databinding.ActivityMainBinding


@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

val navHostFragment =
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
setupActionBarWithNavController(navController)
}
override fun onSupportNavigateUp(): Boolean {
val navController = this.findNavController(R.id.nav_host_fragment)
return navController.navigateUp()
}
}
9 changes: 9 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/MyApp.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ru.otus.basicarchitecture

import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class MyApp : Application() {

}
11 changes: 11 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/Repository.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ru.otus.basicarchitecture

import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class Repository @Inject constructor(){
fun getInterests() :List<String> {
return mutableListOf<String>("Еда","Работа","Отдых", "Кино", "Спорт")
}
}
57 changes: 57 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/ResultFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package ru.otus.basicarchitecture

import android.app.Activity
import android.os.Build
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.android.material.chip.Chip
import dagger.hilt.android.AndroidEntryPoint
import java.time.format.DateTimeFormatter
import ru.otus.basicarchitecture.databinding.FragmentResultsBinding
import javax.inject.Inject

@AndroidEntryPoint
class ResultFragment : Fragment(R.layout.fragment_results) {
private lateinit var binding: FragmentResultsBinding
@Inject
lateinit var wizardCache: WizardCache
private lateinit var listOfInterests : List<String?>

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentResultsBinding.inflate(inflater)
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.nameTextView.text = wizardCache.name
binding.surnameTextView.text = wizardCache.surname

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
binding.birthdayTextView.text = wizardCache.date.format(DateTimeFormatter.ofPattern("dd.MM.yyyy"))
}
listOfInterests = wizardCache.interests
listOfInterests.forEach { tag ->
val chip = Chip(binding.checkedChipGroup.context)
chip.text= tag
chip.isClickable = false
chip.isCheckable = false
chip.textSize = 25F
binding.checkedChipGroup.addView(chip)
}

binding.addressTextView.text = wizardCache.address
}
}


Loading