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
36 changes: 29 additions & 7 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id("org.jetbrains.kotlin.kapt")
id("org.jetbrains.kotlin.plugin.serialization")
}

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

defaultConfig {
applicationId "ru.otus.basicarchitecture"
minSdk 24
targetSdk 33
minSdk 26
targetSdk 34
versionCode 1
versionName "1.0"

Expand All @@ -24,20 +26,40 @@ android {
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
buildFeatures {
viewBinding true
}
kotlinOptions {
jvmTarget = '1.8'
jvmTarget = '17'
}
kapt {
correctErrorTypes true
}
}

dependencies {
implementation("com.google.dagger:dagger:2.48.1")
kapt("com.google.dagger:dagger-compiler:2.48.1")

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 'androidx.navigation:navigation-fragment-ktx:2.7.6'
implementation 'androidx.navigation:navigation-ui-ktx:2.7.6'
implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.1")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.1")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")

testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
Expand Down
12 changes: 10 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
<?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:name=".App"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
Expand All @@ -11,10 +12,17 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.BasicArchitecture"
android:usesCleartextTraffic="true"
tools:targetApi="31">
<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>
12 changes: 12 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/App.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ru.otus.basicarchitecture

import android.app.Application
import ru.otus.basicarchitecture.DI.MainComponent.ApplicationModule
import ru.otus.basicarchitecture.DI.MainComponent.DaggerMainComponent

class App : Application() {
val component by lazy {
DaggerMainComponent.builder()
.applicationModule(ApplicationModule(this)).build()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.otus.basicarchitecture.Core.Model

data class Address(
val address: String
) : BaseModel
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package ru.otus.basicarchitecture.Core.Model

sealed interface BaseModel
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ru.otus.basicarchitecture.Core.Model.DTO

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class SuggestionRequest(
@SerialName("query")
val query: String
)

@Serializable
data class Suggestions(
@SerialName("suggestions")
val suggestions: List<Suggestion>?
)

@Serializable
data class Suggestion(
@SerialName("value")
val value: String?
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.otus.basicarchitecture.Core.Model

data class Interests (
var interests: String
) : BaseModel
22 changes: 22 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/Core/Model/Person.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ru.otus.basicarchitecture.Core.Model

import ru.otus.basicarchitecture.DI.FragmentScope

@FragmentScope
data class Person(
var firstName: String,
var surName: String,
var dateOfBirth: String
) : BaseModel {
companion object {
const val defaultValueProperty = ""

fun defaultPerson(): Person {
return Person(
defaultValueProperty,
defaultValueProperty,
defaultValueProperty
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ru.otus.basicarchitecture.Core.Model

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import javax.inject.Inject

class ViewModelFactory @Inject constructor(
private val viewModels: @JvmSuppressWildcards Map<String, ViewModel>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return viewModels[modelClass.simpleName] as T
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.otus.basicarchitecture.Core.Utils

object AppConstant {
const val API_KEY = "463d2f8b8abd97cf30e7ee538d5e6e6f36242b3e"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package ru.otus.basicarchitecture.Core.Utils

import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
import android.text.SpannableString
import android.widget.Toast
import ru.otus.basicarchitecture.R
import javax.inject.Inject

class ErrorService @Inject constructor() {
private var context: Context? = null
fun show(message: String) {
val title = "Ошибка"
if (context!= null) {
Toast.makeText(context,message ,Toast.LENGTH_SHORT).show();

}

}

fun setContext(context: Context?) {
this.context = context
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.otus.basicarchitecture.Core.Utils

import android.text.Editable

fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ru.otus.basicarchitecture.DI.Fragment1

import dagger.Subcomponent
import ru.otus.basicarchitecture.DI.FragmentComponents.FirstScreen.PersonModule
import ru.otus.basicarchitecture.DI.FragmentScope
import ru.otus.basicarchitecture.Ui.Fragment1.Fragment1

@FragmentScope
@Subcomponent(modules = [PersonModule::class, Fragment1ViewModelModule::class])
interface Fragment1SubComponent {
@Subcomponent.Builder
interface Builder {
fun build() : Fragment1SubComponent
}

fun inject(fragment1: Fragment1)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ru.otus.basicarchitecture.DI.Fragment1

import androidx.lifecycle.ViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
import dagger.multibindings.StringKey
import ru.otus.basicarchitecture.Ui.Fragment1.Fragment1ViewModel

@Module
interface Fragment1ViewModelModule {

@IntoMap
@StringKey("Fragment1ViewModel")
@Binds
fun bindFirstScreenViewModel(impl: Fragment1ViewModel): ViewModel

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ru.otus.basicarchitecture.DI.FragmentComponents.FirstScreen

import dagger.Module
import dagger.Provides
import ru.otus.basicarchitecture.Core.Model.Person
import ru.otus.basicarchitecture.DI.FragmentScope


@Module
class PersonModule {
@FragmentScope
@Provides
fun providePerson(): Person {
return Person.defaultPerson()
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.otus.basicarchitecture.DI.Fragment2
import dagger.Module
import dagger.Provides
import ru.otus.basicarchitecture.Core.Model.Address
import ru.otus.basicarchitecture.DI.FragmentScope

@Module
class AddressModule {
@FragmentScope
@Provides
fun providesAddress(): Address {
return Address("")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ru.otus.basicarchitecture.DI.Fragment2

import android.content.Context
import dagger.BindsInstance
import dagger.Subcomponent
import ru.otus.basicarchitecture.DI.FragmentComponents.FirstScreen.PersonModule
import ru.otus.basicarchitecture.DI.FragmentScope
import ru.otus.basicarchitecture.Ui.Fragment1.Fragment2

@FragmentScope
@Subcomponent(modules = [AddressModule::class, Fragment2ViewModelModule::class])
interface Fragment2SubComponent {
@Subcomponent.Builder
interface Builder {
fun build() : Fragment2SubComponent
}

fun inject(fragment2: Fragment2)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ru.otus.basicarchitecture.DI.Fragment2
import androidx.lifecycle.ViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
import dagger.multibindings.StringKey
import ru.otus.basicarchitecture.Ui.Fragment1.Fragment2ViewModel

@Module
interface Fragment2ViewModelModule {
@IntoMap
@StringKey("Fragment2ViewModel")
@Binds
fun bindSecondScreenViewModel(impl: Fragment2ViewModel): ViewModel

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ru.otus.basicarchitecture.DI.Fragment3

import dagger.Subcomponent
import ru.otus.basicarchitecture.DI.FragmentScope
import ru.otus.basicarchitecture.Ui.Fragment3.Fragment3

@FragmentScope
@Subcomponent(modules = [Fragment3ViewModelModule::class])
interface Fragment3SubComponent {

@Subcomponent.Builder
interface Builder {
fun build() : Fragment3SubComponent
}

fun inject(fragmentThird: Fragment3)


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ru.otus.basicarchitecture.DI.Fragment3

import androidx.lifecycle.ViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
import dagger.multibindings.StringKey
import ru.otus.basicarchitecture.Ui.Fragment3.Fragment3ViewModel

@Module
interface Fragment3ViewModelModule {

@IntoMap
@StringKey("Fragment3ViewModel")
@Binds
fun bindThirdScreenViewModel(impl: Fragment3ViewModel): ViewModel

}
Loading