Skip to content

Commit

Permalink
Merge pull request #31 from ElchinGasymov/iteration_1_review
Browse files Browse the repository at this point in the history
Iteration 1 review
  • Loading branch information
G-dev-ui authored Aug 5, 2024
2 parents a500319 + be6a618 commit 3d6834d
Show file tree
Hide file tree
Showing 94 changed files with 1,205 additions and 46 deletions.
18 changes: 17 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("ru.practicum.android.diploma.plugins.developproperties")
id("com.google.devtools.ksp")
id("kotlin-parcelize")
}

android {
Expand Down Expand Up @@ -36,16 +38,30 @@ android {

buildFeatures {
buildConfig = true
viewBinding = true
}
}

dependencies {
implementation(libs.androidX.core)
implementation(libs.androidX.appCompat)

ksp(libs.room.compiler)
implementation(libs.room.runtime)
implementation(libs.room.ktx)
implementation(libs.kotlinx.coroutines.android)
implementation(libs.fragment.ktx)
// UI layer libraries
implementation(libs.ui.material)
implementation(libs.ui.constraintLayout)
implementation(libs.glide)
implementation(libs.retrofit.v290)
implementation(libs.converter.gson.v290)
implementation(libs.gson)
implementation(libs.koin.android)
implementation(libs.navigation.fragment.ktx)
implementation(libs.navigation.ui.ktx)
annotationProcessor(libs.compiler)
implementation(libs.byViewBinding)

// region Unit tests
testImplementation(libs.unitTests.junit)
Expand Down
11 changes: 8 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

<application
android:name="ru.practicum.android.diploma.util.App"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
Expand All @@ -14,13 +18,14 @@
tools:targetApi="31">
<activity
android:name=".ui.root.RootActivity"
android:exported="true">
android:screenOrientation="portrait"
android:exported="true"
tools:ignore="DiscouragedApi,LockedOrientationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

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

</manifest>
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ru.practicum.android.diploma.data.db

import androidx.room.Database
import androidx.room.RoomDatabase

@Database(
version = 1,
entities = [VacancyEntity::class]
)
abstract class AppDatabase : RoomDatabase()

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ru.practicum.android.diploma.data.db

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "vacancy_table")
data class VacancyEntity(
@PrimaryKey(autoGenerate = true)
val vacancyId: Int
)

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.android.diploma.data.db.dao

import androidx.room.Dao

@Dao
interface VacancyDao

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package ru.practicum.android.diploma.data.dto

const val RESULT_CODE_NO_INTERNET = -1
const val RESULT_CODE_SUCCESS = 200
const val RESULT_CODE_BAD_REQUEST = 400
const val RESULT_CODE_SERVER_ERROR = 500

class Responce {
var resultCode = 0
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.practicum.android.diploma.data.dto

data class SearchRequest(
val options: Map<String, String>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.practicum.android.diploma.data.dto

data class VacancyRequest(
val id: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ru.practicum.android.diploma.data.network

import retrofit2.http.GET
import retrofit2.http.Headers
import retrofit2.http.Path
import retrofit2.http.QueryMap
import ru.practicum.android.diploma.BuildConfig
import ru.practicum.android.diploma.data.dto.Responce

const val USER_AGENT_AUTHORIZATION = "Authorization: Bearer ${BuildConfig.HH_ACCESS_TOKEN}"
const val USER_AGENT_APP_NAME = "HH-User-Agent: CareerHub ([email protected])"

interface HHApiService {
@Headers(USER_AGENT_AUTHORIZATION, USER_AGENT_APP_NAME)
@GET("vacancies/{vacancy_id}")
suspend fun getVacancy(@Path("vacancy_id") id: Int): Responce

@Headers(USER_AGENT_AUTHORIZATION, USER_AGENT_APP_NAME)
@GET("vacancies")
suspend fun searchVacancies(@QueryMap options: Map<String, String>): Responce
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.android.diploma.data.network

import ru.practicum.android.diploma.data.dto.Responce

interface NetworkClient {
suspend fun doRequest(dto: Any): Responce
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package ru.practicum.android.diploma.data.network

import android.content.Context
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import retrofit2.HttpException
import ru.practicum.android.diploma.data.dto.RESULT_CODE_BAD_REQUEST
import ru.practicum.android.diploma.data.dto.RESULT_CODE_NO_INTERNET
import ru.practicum.android.diploma.data.dto.RESULT_CODE_SERVER_ERROR
import ru.practicum.android.diploma.data.dto.RESULT_CODE_SUCCESS
import ru.practicum.android.diploma.data.dto.Responce
import ru.practicum.android.diploma.data.dto.SearchRequest
import ru.practicum.android.diploma.data.dto.VacancyRequest
import ru.practicum.android.diploma.util.isInternetAvailable

class RetrofitNetworkClient(
private val hhApiService: HHApiService,
private val context: Context
) : NetworkClient {

override suspend fun doRequest(dto: Any): Responce {
if (!isInternetAvailable(context)) {
return Responce().apply { resultCode = RESULT_CODE_NO_INTERNET }
}
return getResponce(dto = dto)
}

private suspend fun getResponce(dto: Any): Responce {
return withContext(Dispatchers.IO) {
try {
when (dto) {
is VacancyRequest -> {
val response = hhApiService.getVacancy(dto.id)
response.apply { resultCode = RESULT_CODE_SUCCESS }
}

is SearchRequest -> {
val response = hhApiService.searchVacancies(options = dto.options)
response.apply { resultCode = RESULT_CODE_SUCCESS }
}

else -> {
Responce().apply { resultCode = RESULT_CODE_BAD_REQUEST }
}
}

} catch (e: HttpException) {
println("RetrofitClient error code: ${e.code()} message: ${e.message}")
Responce().apply { resultCode = RESULT_CODE_SERVER_ERROR }
}
}
}

}
35 changes: 35 additions & 0 deletions app/src/main/java/ru/practicum/android/diploma/di/DataModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package ru.practicum.android.diploma.di

import androidx.room.Room
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.module
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import ru.practicum.android.diploma.data.db.AppDatabase
import ru.practicum.android.diploma.data.network.HHApiService
import ru.practicum.android.diploma.data.network.NetworkClient
import ru.practicum.android.diploma.data.network.RetrofitNetworkClient

const val BASE_URL = "https://api.hh.ru/"
val dataModule = module {
single<NetworkClient> {
RetrofitNetworkClient(
hhApiService = get(),
context = androidContext()
)
}

single<HHApiService> {
Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(HHApiService::class.java)
}
single {
Room.databaseBuilder(androidContext(), AppDatabase::class.java, "database.db")
.fallbackToDestructiveMigration()
.build()
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.android.diploma.di

import org.koin.dsl.module

val interactorModule = module {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.android.diploma.di

import org.koin.dsl.module

val repositoryModule = module {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.android.diploma.di

import org.koin.dsl.module

val viewModelModule = module {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package ru.practicum.android.diploma.ui.fragments

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import by.kirich1409.viewbindingdelegate.CreateMethod
import by.kirich1409.viewbindingdelegate.viewBinding
import ru.practicum.android.diploma.databinding.FragmentFavouritesBinding

class FavouritesFragment : Fragment() {

private val binding: FragmentFavouritesBinding by viewBinding(CreateMethod.INFLATE)

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

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package ru.practicum.android.diploma.ui.fragments

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 by.kirich1409.viewbindingdelegate.CreateMethod
import by.kirich1409.viewbindingdelegate.viewBinding
import ru.practicum.android.diploma.R
import ru.practicum.android.diploma.databinding.FragmentFilterBinding

class FilterFragment : Fragment() {

private val binding: FragmentFilterBinding by viewBinding(CreateMethod.INFLATE)

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

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

binding.buttonBackToSearchFromFilter.setOnClickListener {
findNavController().navigate(R.id.mainFragment)
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package ru.practicum.android.diploma.ui.fragments

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 by.kirich1409.viewbindingdelegate.CreateMethod
import by.kirich1409.viewbindingdelegate.viewBinding
import ru.practicum.android.diploma.R
import ru.practicum.android.diploma.databinding.FragmentSearchBinding

class SearchFragment : Fragment() {

private val binding: FragmentSearchBinding by viewBinding(CreateMethod.INFLATE)

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

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

binding.buttonToFilter.setOnClickListener {
findNavController().navigate(R.id.action_searchFragment_to_filterFragment)
}

binding.buttonToVacancy.setOnClickListener {
findNavController().navigate(R.id.action_searchFragment_to_vacancyFragment)
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package ru.practicum.android.diploma.ui.fragments

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import by.kirich1409.viewbindingdelegate.CreateMethod
import by.kirich1409.viewbindingdelegate.viewBinding
import ru.practicum.android.diploma.databinding.FragmentTeamBinding

class TeamFragment : Fragment() {

private val binding: FragmentTeamBinding by viewBinding(CreateMethod.INFLATE)

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

}
Loading

0 comments on commit 3d6834d

Please sign in to comment.