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
56 changes: 51 additions & 5 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,16 +1,32 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
}



kotlin {
jvmToolchain {
(System.getenv("JAVA_HOME") ?: "/path/to/jdk11") as File
}
}

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())


def dDataTokin = properties.getProperty('D_DATA_TOKIN', '')

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

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

Expand All @@ -19,9 +35,14 @@ android {

buildTypes {
release {
buildConfigField 'String', 'D_DATA_TOKIN', "\"${dDataTokin}\""
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
buildConfigField 'String', 'D_DATA_TOKIN', "\"${dDataTokin}\""
}

}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
Expand All @@ -30,15 +51,40 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
kotlinOptions.jvmTarget = '1.8'
}

buildFeatures {
viewBinding true
buildConfig = true
}

}

dependencies {

implementation 'androidx.core:core-ktx:1.8.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'
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.0'
testImplementation 'org.mockito:mockito-inline:3.8.0'
testImplementation "androidx.arch.core:core-testing:2.1.0"
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.47'
kapt 'com.google.dagger:hilt-compiler:2.47'
kapt("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0")
implementation 'com.google.android.flexbox:flexbox:3.0.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
implementation 'androidx.databinding:databinding-runtime:8.1.0'
implementation "androidx.navigation:navigation-fragment-ktx:2.7.0"
implementation "androidx.navigation:navigation-ui-ktx:2.7.0"
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}
10 changes: 9 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
<?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=".MyApplication"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
Expand All @@ -14,7 +16,13 @@
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>
55 changes: 55 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/CustomArrayAdapter.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package ru.otus.basicarchitecture

import android.content.Context
import android.widget.ArrayAdapter
import android.widget.Filter

class CustomArrayAdapter(
context: Context,
private val items: List<String>
) : ArrayAdapter<String>(context, android.R.layout.simple_dropdown_item_1line, items) {

override fun getFilter(): Filter {
return object : Filter() {
override fun performFiltering(constraint: CharSequence?): FilterResults {
val results = FilterResults()

if (constraint.isNullOrEmpty()) {
results.values = items
results.count = items.size
} else {
val searchText = constraint.toString().lowercase().cleanForSearch()
val matchedItems = items.filter {
it.lowercase().cleanForSearch().contains(searchText)
}
results.values = matchedItems
results.count = matchedItems.size
}

return results
}

private fun String.cleanForSearch(): String {
return this.replace("г ", "")
.replace(", ", " ")
.replace(" пер", "")
.replace(" ул", "")
.replace(" д", "")
.replace(" б-р", "")
.replace(" р-н", "")
}

override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
if (results != null && results.count > 0) {
notifyDataSetChanged()
} else {
notifyDataSetInvalidated()
}
}

override fun convertResultToString(resultValue: Any?): CharSequence {
return resultValue as? String ?: ""
}
}
}
}
5 changes: 5 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/DaDataRequest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.otus.basicarchitecture

data class DaDataRequest(
val query: String,
)
31 changes: 31 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/DaDataService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package ru.otus.basicarchitecture

import okhttp3.MediaType
import okhttp3.ResponseBody
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.POST


interface DaDataService {
@POST("suggestions/api/4_1/rs/suggest/address")
suspend fun getSuggestions(@Body request: DaDataRequest): Response<SuggestionsResponse>

}

class FakeDaDataService : DaDataService {
var shouldReturnError = false

override suspend fun getSuggestions(request: DaDataRequest): Response<SuggestionsResponse> {
return if (shouldReturnError) {
Response.error(400, "Bad Request".toResponseBody())
} else {
val fakeSuggestions = listOf(Suggestion("1","2",Data("1","2","3","4","5")))
val fakeResponse = SuggestionsResponse(fakeSuggestions)
Response.success(fakeResponse)
}
}

fun String.toResponseBody(): ResponseBody =
ResponseBody.create(MediaType.parse("text/plain"), this)
}
19 changes: 18 additions & 1 deletion app/src/main/java/ru/otus/basicarchitecture/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,28 @@
package ru.otus.basicarchitecture

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupActionBarWithNavController
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val navHostFragment =
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
setupActionBarWithNavController(navController)
}

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

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

@HiltAndroidApp
class MyApplication : Application()
50 changes: 50 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/NetworkModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package ru.otus.basicarchitecture

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton


private const val BASE_URL = "https://suggestions.dadata.ru/"
private const val D_DATA_TOKIN = BuildConfig.D_DATA_TOKIN

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {

@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "application/json")
.addHeader("Authorization", "Token $D_DATA_TOKIN")
.build()
chain.proceed(request)
}
.build()
}

@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
}

@Provides
@Singleton
fun provideDaDataService(retrofit: Retrofit): DaDataService {
return retrofit.create(DaDataService::class.java)
}
}
23 changes: 23 additions & 0 deletions app/src/main/java/ru/otus/basicarchitecture/Suggestion.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ru.otus.basicarchitecture

import com.google.gson.annotations.SerializedName

data class Suggestion(
val value: String,
@SerializedName("unrestricted_value")
val unrestrictedValue: String,
val data: Data,
)

data class Data(
@SerializedName("region_kladr_id")
val regionKladrId: String,
@SerializedName("city_kladr_id")
val cityKladrId: String,
@SerializedName("kladr_id")
val kladrId: String,
@SerializedName("geo_lat")
val geoLat: String,
@SerializedName("geo_lon")
val geoLon: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.otus.basicarchitecture

data class SuggestionsResponse(
val suggestions: List<Suggestion>
)
Loading