Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Iteration 1 review #31

Merged
merged 64 commits into from
Aug 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
a57bb50
Добавил круглую и квадратную легаси иконки
ElchinGasymov Aug 2, 2024
ac63b45
Созданы основные фрагменты
AnShok Aug 2, 2024
efd902f
Изменен манифест, добавлены необходимые библиотеки в градл, добавлен …
Logomann Aug 2, 2024
76374f6
Добавлены классы фрагментов
AnShok Aug 2, 2024
9836c2b
Merge pull request #5 from ElchinGasymov/main
ElchinGasymov Aug 2, 2024
e9d387a
Добавил круглую и квадратную легаси иконки
ElchinGasymov Aug 2, 2024
f0eab54
Добавил круглую и квадратную легаси иконки
ElchinGasymov Aug 2, 2024
6109e95
На все фрагменты добавлен TextView с описанием что за экран
AnShok Aug 2, 2024
417441b
Изменен манифест, добавлены необходимые библиотеки в градл, добавлен …
Logomann Aug 2, 2024
1de463b
Заполнен граф навигации
AnShok Aug 2, 2024
c926178
Добавлены кнопки перехода с экрана поиска на экран фильтров и вакансии
AnShok Aug 2, 2024
e486849
Добавлены шрифты
AnShok Aug 2, 2024
cfd4e1f
Добавлены цвета, темы, строковые ресурсы
AnShok Aug 2, 2024
068a38f
Исправлена ошибка в строковых ресурсах
AnShok Aug 2, 2024
0e430d8
Добавлены ресурсы drawable
AnShok Aug 2, 2024
017eac5
Добавлены ресурсы dimens.xml
AnShok Aug 2, 2024
c6ec080
Изменен манифест, добавлены необходимые библиотеки в градл, добавлен …
Logomann Aug 2, 2024
0e88985
Убраны дубли в strings.xml
AnShok Aug 2, 2024
2f8f741
Убраны дубли в strings.xml
AnShok Aug 2, 2024
2e6cb40
Merge pull request #3 from ElchinGasymov/Career_Hub_add_manifest_gradle
Logomann Aug 2, 2024
8c747da
Добавил утилиты для дебаунса и проверки интернета
G-dev-ui Aug 2, 2024
af5aed3
Добавил утилиты для дебаунса и проверки интернета(Исправил отступы)
G-dev-ui Aug 2, 2024
22ff440
Настроен DI KOIN
AndreyRyabitckiy Aug 2, 2024
0e79157
Правка конфликтов
ElchinGasymov Aug 3, 2024
edfc8e4
Merge pull request #2 from ElchinGasymov/career_hub_add_icon
ElchinGasymov Aug 3, 2024
bbb41b7
Merge pull request #7 from ElchinGasymov/Career_Hub_add_themes_&_colors
ElchinGasymov Aug 3, 2024
ccdd8fc
Fix
AndreyRyabitckiy Aug 3, 2024
6d20ed4
Merge pull request #10 from ElchinGasymov/Career_Hub_add_drawable_and…
ElchinGasymov Aug 3, 2024
fb03849
Merge branch 'develop' into Career_Hub_Navigation_graph_and_screen_caps
AnShok Aug 3, 2024
a4f9560
Fix2
AndreyRyabitckiy Aug 3, 2024
29d4783
Fix2.1
AndreyRyabitckiy Aug 3, 2024
0487daf
Добавил утилиты для дебаунса и проверки интернета(Исправлены все заме…
G-dev-ui Aug 3, 2024
fa847a0
Merge pull request #14 from ElchinGasymov/Career_Hub_DI
ElchinGasymov Aug 3, 2024
d56d68d
Добавил утилиты для дебаунса и проверки интернета(Исправлены все заме…
G-dev-ui Aug 3, 2024
0066ebf
Кодстайл
AnShok Aug 3, 2024
5fca205
Убрал дубль, который был в градл
AnShok Aug 3, 2024
0fd2ee9
Добавлена БД ( класс AppDatabase)
Logomann Aug 3, 2024
8124282
Добавлена БД ( класс AppDatabase) и инициализация в Koin
Logomann Aug 3, 2024
d7fcced
Добавлен dao интерфейс и таблица VacancyEntity
Logomann Aug 3, 2024
3bd144b
Добавлен dao интерфейс и таблица VacancyEntity
Logomann Aug 3, 2024
a52f532
Merge pull request #12 from ElchinGasymov/Career_Hab_utils_debouncer_…
ElchinGasymov Aug 3, 2024
5615f46
Merge pull request #20 from ElchinGasymov/Career_Hub_add_database
Logomann Aug 3, 2024
6dca7f8
Исправлены замечания
AnShok Aug 3, 2024
b197f39
Merge pull request #19 from ElchinGasymov/Career_Hub_Navigation_graph…
ElchinGasymov Aug 4, 2024
6e36cbd
Добавил панель навигации, выпилил ненужный второй синий цвет
ElchinGasymov Aug 4, 2024
437f17b
Добавил byViewBinding
ElchinGasymov Aug 4, 2024
8f2a4f9
Выполнена верстка экрана Команды.
AndreyRyabitckiy Aug 4, 2024
b7d25bb
Merge pull request #24 from ElchinGasymov/career_hub_add_by_view_binding
AndreyRyabitckiy Aug 4, 2024
508aaa6
Merge pull request #22 from ElchinGasymov/career_hub_add_bottom_navig…
AndreyRyabitckiy Aug 4, 2024
d6d30f8
Добавил все необходимое и немного подправил градл для анатаций
G-dev-ui Aug 4, 2024
da4ab58
Merge branch 'refs/heads/develop' into Career_Hab_add-NetworkClient
G-dev-ui Aug 4, 2024
2f5981d
Merge pull request #25 from ElchinGasymov/Career_Hub_add_team_screen
ElchinGasymov Aug 4, 2024
8b05591
Добавил все необходимое и немного подправил градл для анатаций(исправил)
G-dev-ui Aug 4, 2024
be6a8e7
Добавил все необходимое и немного подправил градл для анатаций(добави…
G-dev-ui Aug 4, 2024
93cfa3e
Merge pull request #26 from ElchinGasymov/Career_Hab_add-NetworkClient
G-dev-ui Aug 4, 2024
ef485b6
Починил bottomNavigationView
ElchinGasymov Aug 5, 2024
1a92e4d
Merge pull request #30 from ElchinGasymov/career_hub_bottom_navigatio…
AndreyRyabitckiy Aug 5, 2024
6c0e151
fix
G-dev-ui Aug 5, 2024
abaecb7
fix2
G-dev-ui Aug 5, 2024
ed83600
fix3
G-dev-ui Aug 5, 2024
f107660
fix4
G-dev-ui Aug 5, 2024
aa6efd3
fix4
G-dev-ui Aug 5, 2024
7eda430
Merge remote-tracking branch 'origin/iteration_1_review' into iterati…
G-dev-ui Aug 5, 2024
be6a618
Lint fix
ElchinGasymov Aug 5, 2024
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
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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
suspend fun doRequest(dto: Any): Responce
suspend fun doRequest(dto: Any): Response

Опечатка

}
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)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

При использовании viewBinding во фрагментах обязательно нужно обнулять _binding в onDestroyView, иначе будет утечка памяти. Почитать о том, как использовать эту фичу во фрагментах можно тут - https://developer.android.com/topic/libraries/view-binding#fragments. Почитать подробнее про утечку можно здесь - https://stackoverflow.com/questions/65295104/android-view-binding-clear-binding-in-fragment-lifecycle

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ко всем фрагментам это относится


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)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут либо popBackStack() должен быть, либо navigateUp(), т.к. тут нужно на предыдущий фрагмент вернуться, а не на нвоый экран переходить

}
}

}
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
Loading