From a3f62404a75d2966cc3e4ce90dcc872841c13167 Mon Sep 17 00:00:00 2001 From: YURY TILMAN Date: Tue, 18 Nov 2025 09:56:14 +0300 Subject: [PATCH 1/5] Task 1 implement --- app/build.gradle.kts | 1 + app/src/main/AndroidManifest.xml | 2 + .../kotlin/ru/otus/cookbook/MainActivity.kt | 14 +++ .../ru/otus/cookbook/data/RecipeRepository.kt | 24 +++-- .../ru/otus/cookbook/ui/CookbookFragment.kt | 62 ++++++++++- .../ru/otus/cookbook/ui/ItemListener.kt | 9 ++ .../otus/cookbook/ui/RecipeListDiffAdapter.kt | 100 ++++++++++++++++++ .../ru/otus/cookbook/ui/RecipeViewHolder.kt | 73 +++++++++++++ app/src/main/res/drawable/cart_item_icon.xml | 29 +++++ app/src/main/res/layout/activity_main.xml | 14 ++- app/src/main/res/layout/fragment_cookbook.xml | 17 ++- .../main/res/layout/vh_recipe_category.xml | 15 ++- app/src/main/res/layout/vh_recipe_item.xml | 65 +++++++++++- app/src/main/res/navigation/recipe_graph.xml | 11 ++ gradle/libs.versions.toml | 3 +- 15 files changed, 411 insertions(+), 28 deletions(-) create mode 100644 app/src/main/kotlin/ru/otus/cookbook/ui/ItemListener.kt create mode 100644 app/src/main/kotlin/ru/otus/cookbook/ui/RecipeListDiffAdapter.kt create mode 100644 app/src/main/kotlin/ru/otus/cookbook/ui/RecipeViewHolder.kt create mode 100644 app/src/main/res/drawable/cart_item_icon.xml create mode 100644 app/src/main/res/navigation/recipe_graph.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f3207a6..f8dc461 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -48,6 +48,7 @@ dependencies { implementation(libs.material) implementation(libs.androidx.activity) implementation(libs.androidx.constraintlayout) + implementation(libs.coil) testImplementation(libs.junit) testImplementation(libs.kotlin.coroutines.test) } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 063f4d1..431aadd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + ) { @@ -16,9 +16,9 @@ class RecipeRepository(recipes: List) { private val recipes = MutableStateFlow(recipes) /** - * Returns the list of recipes as a flow. - * @param scope The coroutine scope to use for the flow. - * @param filter The filter to apply to the recipes. + * Возвращает список рецептов в виде потока. + * @param scope Область видимости корутины для потока. + * @param filter Фильтр для применения к рецептам. */ suspend fun getRecipes(scope: CoroutineScope, filter: RecipeFilter): StateFlow> = recipes .map { recipes -> recipes.asSequence() @@ -29,21 +29,23 @@ class RecipeRepository(recipes: List) { .stateIn(scope) /** - * Returns the list of categories as a flow. - * @param scope The coroutine scope to use for the flow. + * Возвращает список категорий в виде потока. + * @param scope Область видимости корутины для потока. */ suspend fun getCategories(scope: CoroutineScope): StateFlow> = recipes .map { recipes -> recipes.map { it.category }.distinct().sorted() } .stateIn(scope) /** - * Returns the recipe with the specified ID. + * Возвращает рецепт по указанному идентификатору. + * @param id Идентификатор рецепта. + * @return Рецепт с указанным идентификатором или null, если рецепт не найден. */ fun getRecipe(id: Int): Recipe? = recipes.value.find { it.id == id } /** - * Returns the list of recipes as a flow. - * @param id The ID of the recipe to delete. + * Удаляет рецепт с указанным идентификатором. + * @param id Идентификатор рецепта для удаления. */ fun deleteRecipe(id: Int) { recipes.update { list -> @@ -52,8 +54,8 @@ class RecipeRepository(recipes: List) { } /** - * Adds a recipe to the list. - * @param recipe The recipe to add. + * Добавляет новый рецепт в список. + * @param recipe Рецепт для добавления. */ fun addRecipe(recipe: Recipe) { recipes.update { list -> diff --git a/app/src/main/kotlin/ru/otus/cookbook/ui/CookbookFragment.kt b/app/src/main/kotlin/ru/otus/cookbook/ui/CookbookFragment.kt index efe6939..6e3e645 100644 --- a/app/src/main/kotlin/ru/otus/cookbook/ui/CookbookFragment.kt +++ b/app/src/main/kotlin/ru/otus/cookbook/ui/CookbookFragment.kt @@ -4,19 +4,36 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout +import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.DividerItemDecoration import kotlinx.coroutines.launch import ru.otus.cookbook.data.RecipeListItem import ru.otus.cookbook.databinding.FragmentCookbookBinding -class CookbookFragment : Fragment() { +/** + * Фрагмент для отображения списка рецептов + */ +class CookbookFragment : Fragment(), ItemListener { private val binding = FragmentBindingDelegate(this) private val model: CookbookFragmentViewModel by viewModels { CookbookFragmentViewModel.Factory } + private val recipeListDiffAdapter: RecipeListDiffAdapter by lazy { RecipeListDiffAdapter(this) } + + + /** + * Создает и возвращает представление фрагмента + * + * @param inflater Объект LayoutInflater для создания представления + * @param container Родительская ViewGroup + * @param savedInstanceState Сохраненное состояние фрагмента + * @return Представление фрагмента + */ override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -26,6 +43,12 @@ class CookbookFragment : Fragment() { FragmentCookbookBinding::inflate ) + /** + * Вызывается после создания представления фрагмента + * + * @param view Представление фрагмента + * @param savedInstanceState Сохраненное состояние фрагмента + */ override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setupRecyclerView() @@ -36,11 +59,44 @@ class CookbookFragment : Fragment() { } } + /** + * Настраивает RecyclerView для отображения списка рецептов + */ private fun setupRecyclerView() = binding.withBinding { - // Setup RecyclerView + recycleView.addItemDecoration( + DividerItemDecoration( + this@CookbookFragment.requireActivity(), + LinearLayout.VERTICAL + ) + ) + recycleView.adapter = recipeListDiffAdapter + model.recipeList } + /** + * Обновляет список рецептов в адаптере + * + * @param recipeList Новый список рецептов для отображения + */ private fun onRecipeListUpdated(recipeList: List) { - // Handle recipe list + recipeListDiffAdapter.submitList(recipeList) + } + + /** + * Обрабатывает нажатие на элемент списка рецептов + * + * @param id Идентификатор выбранного рецепта + */ + override fun onItemClick(id: Int) { + Toast.makeText(requireContext(), "Clicked $id", Toast.LENGTH_SHORT).show() + } + + /** + * Обрабатывает свайп по элементу списка рецептов + * + * @param id Идентификатор рецепта, по которому был совершен свайп + */ + override fun onSwipe(id: Int) { + Toast.makeText(requireContext(), "Swiped $id", Toast.LENGTH_SHORT).show() } } \ No newline at end of file diff --git a/app/src/main/kotlin/ru/otus/cookbook/ui/ItemListener.kt b/app/src/main/kotlin/ru/otus/cookbook/ui/ItemListener.kt new file mode 100644 index 0000000..fcd7d3e --- /dev/null +++ b/app/src/main/kotlin/ru/otus/cookbook/ui/ItemListener.kt @@ -0,0 +1,9 @@ +package ru.otus.cookbook.ui + +import java.util.UUID + +interface ItemListener { + fun onItemClick(id: Int) + fun onSwipe(id: Int) + +} \ No newline at end of file diff --git a/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeListDiffAdapter.kt b/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeListDiffAdapter.kt new file mode 100644 index 0000000..3414c7d --- /dev/null +++ b/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeListDiffAdapter.kt @@ -0,0 +1,100 @@ +package ru.otus.cookbook.ui + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import ru.otus.cookbook.data.RecipeListItem +import ru.otus.cookbook.databinding.VhRecipeCategoryBinding +import ru.otus.cookbook.databinding.VhRecipeItemBinding + +/** + * Адаптер для отображения списка рецептов с использованием DiffUtil для оптимизации обновлений + */ +class RecipeListDiffAdapter( + private val itemListener: ItemListener, +) : ListAdapter(DiffUtilItem()) { + + /** + * Создает ViewHolder для элемента списка в зависимости от типа элемента + * + * @param parent Родительская ViewGroup + * @param viewType Тип представления элемента + * @return ViewHolder для соответствующего типа элемента + */ + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): RecyclerView.ViewHolder { + val inflater = LayoutInflater.from(parent.context) + return when (viewType) { + RecipeListItem.RecipeItem.layoutId -> + RecipeViewHolder(VhRecipeItemBinding.inflate(inflater, parent, false), itemListener) + + RecipeListItem.CategoryItem.layoutId -> + CategoryViewHolder(VhRecipeCategoryBinding.inflate(inflater, parent, false)) + + else -> throw IllegalArgumentException("Unknown view type") + } + } + + /** + * Привязывает данные элемента к ViewHolder + * + * @param holder ViewHolder для привязки данных + * @param position Позиция элемента в списке + */ + override fun onBindViewHolder( + holder: RecyclerView.ViewHolder, + position: Int + ) { + when (val item = getItem(position)) { + is RecipeListItem.RecipeItem -> (holder as RecipeViewHolder).bind(item) + is RecipeListItem.CategoryItem -> (holder as CategoryViewHolder).bind(item) + else -> throw IllegalArgumentException("Unknown item type") + } + } + + /** + * Возвращает тип представления для элемента в указанной позиции + * + * @param position Позиция элемента в списке + * @return Тип представления элемента + */ + override fun getItemViewType(position: Int): Int { + return when (getItem(position)) { + is RecipeListItem.RecipeItem -> RecipeListItem.RecipeItem.layoutId + is RecipeListItem.CategoryItem -> RecipeListItem.CategoryItem.layoutId + else -> -1 + } + } +} + +/** + * Класс для сравнения элементов списка при обновлении данных + */ +private class DiffUtilItem : DiffUtil.ItemCallback() { + + /** + * Проверяет, представляют ли два объекта один и тот же элемент + * + * @param oldItem Старый элемент + * @param newItem Новый элемент + * @return true, если элементы представляют один и тот же объект, иначе false + */ + override fun areItemsTheSame(oldItem: RecipeListItem, newItem: RecipeListItem): Boolean { + return oldItem::class == newItem::class && oldItem.layoutId == newItem.layoutId + } + + /** + * Проверяет, содержат ли два объекта одинаковые данные + * + * @param oldItem Старый элемент + * @param newItem Новый элемент + * @return true, если данные элементов идентичны, иначе false + */ + override fun areContentsTheSame(oldItem: RecipeListItem, newItem: RecipeListItem): Boolean { + return oldItem == newItem + } +} diff --git a/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeViewHolder.kt b/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeViewHolder.kt new file mode 100644 index 0000000..6aaa75c --- /dev/null +++ b/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeViewHolder.kt @@ -0,0 +1,73 @@ +package ru.otus.cookbook.ui + +import android.util.Log +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import coil.load +import coil.request.CachePolicy +import coil.request.ErrorResult +import coil.request.ImageRequest +import coil.request.SuccessResult +import coil.transform.CircleCropTransformation +import ru.otus.cookbook.R +import ru.otus.cookbook.data.RecipeListItem +import ru.otus.cookbook.databinding.VhRecipeCategoryBinding +import ru.otus.cookbook.databinding.VhRecipeItemBinding + + +class RecipeViewHolder( + private val binding: VhRecipeItemBinding, + private val itemListener: ItemListener, +) : RecyclerView.ViewHolder(binding.root) { + + private val recipeAvatar: ImageView = binding.recipeAvatar + private val recipeTitle: TextView = binding.recipeTitle + private val recipeDescription: TextView = binding.recipeDescription + + fun bind(recipe: RecipeListItem.RecipeItem) { + with(recipe) { + loadImage() + recipeTitle.text = title + recipeDescription.text = description + binding.root.setOnClickListener { + itemListener.onItemClick(id) + } + } + } + + private fun RecipeListItem.RecipeItem.loadImage() { + recipeAvatar.load(imageUrl) { + setHeader("User-Agent", "Mozilla/5.0") + placeholder(R.drawable.cart_item_icon) + error(R.drawable.ic_launcher_background) + transformations(CircleCropTransformation()) // Optional: Apply transformations + memoryCachePolicy(CachePolicy.ENABLED) // Optional: Enable memory caching + diskCachePolicy(CachePolicy.ENABLED) // Optional: Enable disk caching + listener( + onSuccess = { request: ImageRequest, result: SuccessResult -> + Log.d("Coil", "Image loaded successfully from ${result.dataSource}") + }, + onError = { request: ImageRequest, result: ErrorResult -> + Log.e("Coil", "Image load failed: ${result.throwable.message}") + recipeAvatar.setImageResource(R.drawable.ic_launcher_background) + } + ) + } + } +} + + +class CategoryViewHolder( + binding: VhRecipeCategoryBinding, +) : RecyclerView.ViewHolder(binding.root) { + + private val categoryName: TextView = binding.categoryName + + + fun bind(category: RecipeListItem.CategoryItem) { + with(category) { + categoryName.text = name + } + } +} diff --git a/app/src/main/res/drawable/cart_item_icon.xml b/app/src/main/res/drawable/cart_item_icon.xml new file mode 100644 index 0000000..f2987f4 --- /dev/null +++ b/app/src/main/res/drawable/cart_item_icon.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 86a5d97..1ef71f7 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -7,13 +7,11 @@ android:layout_height="match_parent" tools:context=".MainActivity"> - + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_cookbook.xml b/app/src/main/res/layout/fragment_cookbook.xml index 77d9ef6..a67ef3b 100644 --- a/app/src/main/res/layout/fragment_cookbook.xml +++ b/app/src/main/res/layout/fragment_cookbook.xml @@ -1,6 +1,21 @@ + android:layout_height="match_parent" + android:paddingVertical="20dp" + > + + \ No newline at end of file diff --git a/app/src/main/res/layout/vh_recipe_category.xml b/app/src/main/res/layout/vh_recipe_category.xml index 006fd49..3ba4482 100644 --- a/app/src/main/res/layout/vh_recipe_category.xml +++ b/app/src/main/res/layout/vh_recipe_category.xml @@ -1,6 +1,17 @@ + android:layout_width="match_parent" + android:layout_height="wrap_content" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + \ No newline at end of file diff --git a/app/src/main/res/layout/vh_recipe_item.xml b/app/src/main/res/layout/vh_recipe_item.xml index 006fd49..965fe07 100644 --- a/app/src/main/res/layout/vh_recipe_item.xml +++ b/app/src/main/res/layout/vh_recipe_item.xml @@ -1,6 +1,67 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:backgroundTint="@color/black" + android:backgroundTintMode="screen" + android:paddingVertical="12dp" + android:paddingStart="16dp" + android:paddingEnd="24dp" + + > + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/recipe_graph.xml b/app/src/main/res/navigation/recipe_graph.xml new file mode 100644 index 0000000..3fe3501 --- /dev/null +++ b/app/src/main/res/navigation/recipe_graph.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 515d8d1..1401f31 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,7 @@ junitVersion = "1.2.1" espressoCore = "3.6.1" serialization = "1.7.3" datastore = "1.1.1" - +coil = "2.5.0" [libraries] kotlin-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } @@ -37,6 +37,7 @@ androidx-activity = { group = "androidx.activity", name = "activity", version.re androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } +coil = { group = "io.coil-kt", name = "coil", version.ref = "coil" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } From 09adfd6e9e5302984087b71a291cb2aef5c8dc88 Mon Sep 17 00:00:00 2001 From: YURY TILMAN Date: Wed, 19 Nov 2025 17:10:32 +0300 Subject: [PATCH 2/5] Task 2 implement --- app/build.gradle.kts | 1 + .../kotlin/ru/otus/cookbook/MainActivity.kt | 14 ---- .../ru/otus/cookbook/data/RecipeRepository.kt | 2 +- .../kotlin/ru/otus/cookbook/data/Utils.kt | 31 ++++++++ .../ru/otus/cookbook/ui/CookbookFragment.kt | 10 ++- .../ru/otus/cookbook/ui/RecipeFragment.kt | 24 +++++-- .../ru/otus/cookbook/ui/RecipeViewHolder.kt | 30 +------- app/src/main/res/anim/fade_in.xml | 6 ++ app/src/main/res/anim/fade_out.xml | 6 ++ app/src/main/res/anim/slide_in.xml | 6 ++ app/src/main/res/anim/slide_out.xml | 6 ++ app/src/main/res/drawable/arrow_left.xml | 10 +++ app/src/main/res/drawable/remove_icon.xml | 9 +++ app/src/main/res/layout/activity_main.xml | 6 +- app/src/main/res/layout/fragment_cookbook.xml | 4 +- app/src/main/res/layout/fragment_recipe.xml | 70 ++++++++++++++++++- app/src/main/res/layout/vh_recipe_item.xml | 5 +- app/src/main/res/menu/recipe_app_bar.xml | 10 +++ app/src/main/res/navigation/recipe_graph.xml | 26 ++++++- app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/strings.xml | 1 + gradle/libs.versions.toml | 5 +- 22 files changed, 216 insertions(+), 68 deletions(-) create mode 100644 app/src/main/kotlin/ru/otus/cookbook/data/Utils.kt create mode 100644 app/src/main/res/anim/fade_in.xml create mode 100644 app/src/main/res/anim/fade_out.xml create mode 100644 app/src/main/res/anim/slide_in.xml create mode 100644 app/src/main/res/anim/slide_out.xml create mode 100644 app/src/main/res/drawable/arrow_left.xml create mode 100644 app/src/main/res/drawable/remove_icon.xml create mode 100644 app/src/main/res/menu/recipe_app_bar.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f8dc461..b5d14b0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -44,6 +44,7 @@ dependencies { implementation(libs.androidx.appcompat) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.navigation.fragment) + //api(libs.androidx.navigation.fragment.ktx) implementation(libs.androidx.navigation.ui) implementation(libs.material) implementation(libs.androidx.activity) diff --git a/app/src/main/kotlin/ru/otus/cookbook/MainActivity.kt b/app/src/main/kotlin/ru/otus/cookbook/MainActivity.kt index 42b5654..6e524b6 100644 --- a/app/src/main/kotlin/ru/otus/cookbook/MainActivity.kt +++ b/app/src/main/kotlin/ru/otus/cookbook/MainActivity.kt @@ -3,28 +3,14 @@ package ru.otus.cookbook import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import ru.otus.cookbook.databinding.ActivityMainBinding -import ru.otus.cookbook.ui.CookbookFragment class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding - private lateinit var cookbookFragment: CookbookFragment - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - - - cookbookFragment = savedInstanceState - ?.let { supportFragmentManager.findFragmentByTag(CookbookFragment::class.simpleName) as? CookbookFragment } - ?: CookbookFragment() - - supportFragmentManager.beginTransaction() - .replace(R.id.fragment_container, cookbookFragment, CookbookFragment::class.simpleName) - .addToBackStack(null) - .commit() - } } \ No newline at end of file diff --git a/app/src/main/kotlin/ru/otus/cookbook/data/RecipeRepository.kt b/app/src/main/kotlin/ru/otus/cookbook/data/RecipeRepository.kt index b8ec221..6e91219 100644 --- a/app/src/main/kotlin/ru/otus/cookbook/data/RecipeRepository.kt +++ b/app/src/main/kotlin/ru/otus/cookbook/data/RecipeRepository.kt @@ -33,7 +33,7 @@ class RecipeRepository(recipes: List) { * @param scope Область видимости корутины для потока. */ suspend fun getCategories(scope: CoroutineScope): StateFlow> = recipes - .map { recipes -> recipes.map { it.category }.distinct().sorted() } + .map { recipes -> recipes.map { it.category }.distinct().sorted() } .stateIn(scope) /** diff --git a/app/src/main/kotlin/ru/otus/cookbook/data/Utils.kt b/app/src/main/kotlin/ru/otus/cookbook/data/Utils.kt new file mode 100644 index 0000000..225de18 --- /dev/null +++ b/app/src/main/kotlin/ru/otus/cookbook/data/Utils.kt @@ -0,0 +1,31 @@ +package ru.otus.cookbook.data + +import android.util.Log +import android.widget.ImageView +import coil.load +import coil.request.CachePolicy +import coil.request.ErrorResult +import coil.request.ImageRequest +import coil.request.SuccessResult +import coil.transform.Transformation +import ru.otus.cookbook.R + +fun loadImage(imageView: ImageView, imageUrl: String, vararg transformations: Transformation) { + imageView.load(imageUrl) { + setHeader("User-Agent", "Mozilla/5.0") + placeholder(R.drawable.cart_item_icon) + error(R.drawable.ic_launcher_background) + transformations(*transformations) // Optional: Apply transformations + memoryCachePolicy(CachePolicy.ENABLED) // Optional: Enable memory caching + diskCachePolicy(CachePolicy.ENABLED) // Optional: Enable disk caching + listener( + onSuccess = { request: ImageRequest, result: SuccessResult -> + Log.d("Coil", "Image loaded successfully from ${result.dataSource}") + }, + onError = { request: ImageRequest, result: ErrorResult -> + Log.e("Coil", "Image load failed: ${result.throwable.message}") + imageView.setImageResource(R.drawable.ic_launcher_background) + } + ) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/ru/otus/cookbook/ui/CookbookFragment.kt b/app/src/main/kotlin/ru/otus/cookbook/ui/CookbookFragment.kt index 6e3e645..e490091 100644 --- a/app/src/main/kotlin/ru/otus/cookbook/ui/CookbookFragment.kt +++ b/app/src/main/kotlin/ru/otus/cookbook/ui/CookbookFragment.kt @@ -10,6 +10,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DividerItemDecoration import kotlinx.coroutines.launch import ru.otus.cookbook.data.RecipeListItem @@ -38,10 +39,7 @@ class CookbookFragment : Fragment(), ItemListener { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View = binding.bind( - container, - FragmentCookbookBinding::inflate - ) + ): View = binding.bind(container, FragmentCookbookBinding::inflate) /** * Вызывается после создания представления фрагмента @@ -70,7 +68,6 @@ class CookbookFragment : Fragment(), ItemListener { ) ) recycleView.adapter = recipeListDiffAdapter - model.recipeList } /** @@ -88,7 +85,8 @@ class CookbookFragment : Fragment(), ItemListener { * @param id Идентификатор выбранного рецепта */ override fun onItemClick(id: Int) { - Toast.makeText(requireContext(), "Clicked $id", Toast.LENGTH_SHORT).show() + findNavController() + .navigate(CookbookFragmentDirections.actionOpenRecipe(id)) } /** diff --git a/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeFragment.kt b/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeFragment.kt index e4460c1..dba6b8c 100644 --- a/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeFragment.kt +++ b/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeFragment.kt @@ -9,13 +9,18 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewmodel.MutableCreationExtras +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import coil.transform.RoundedCornersTransformation import kotlinx.coroutines.launch import ru.otus.cookbook.data.Recipe +import ru.otus.cookbook.data.loadImage import ru.otus.cookbook.databinding.FragmentRecipeBinding class RecipeFragment : Fragment() { - private val recipeId: Int get() = TODO("Use Safe Args to get the recipe ID: https://developer.android.com/guide/navigation/use-graph/pass-data#Safe-args") + private val args: RecipeFragmentArgs by navArgs() + private val recipeId: Int get() = args.recipeId private val binding = FragmentBindingDelegate(this) private val model: RecipeFragmentViewModel by viewModels( @@ -31,13 +36,15 @@ class RecipeFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View = binding.bind( - container, - FragmentRecipeBinding::inflate - ) + ): View = binding.bind(container, FragmentRecipeBinding::inflate) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.withBinding { + topAppBar.setNavigationOnClickListener { + findNavController().navigate(RecipeFragmentDirections.actionBackToCookbook()) + } + } viewLifecycleOwner.lifecycleScope.launch { model.recipe .flowWithLifecycle(viewLifecycleOwner.lifecycle) @@ -53,7 +60,12 @@ class RecipeFragment : Fragment() { } private fun displayRecipe(recipe: Recipe) { - // Display the recipe + binding.withBinding { + loadImage(recipeAvatar, recipe.imageUrl, RoundedCornersTransformation()) + recipeTitle.text = recipe.title + recipeDescription.text = recipe.description + recipeStep.text = recipe.steps.joinToString("\n") + } } private fun deleteRecipe() { diff --git a/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeViewHolder.kt b/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeViewHolder.kt index 6aaa75c..9f2a40c 100644 --- a/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeViewHolder.kt +++ b/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeViewHolder.kt @@ -1,17 +1,11 @@ package ru.otus.cookbook.ui -import android.util.Log import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView -import coil.load -import coil.request.CachePolicy -import coil.request.ErrorResult -import coil.request.ImageRequest -import coil.request.SuccessResult import coil.transform.CircleCropTransformation -import ru.otus.cookbook.R import ru.otus.cookbook.data.RecipeListItem +import ru.otus.cookbook.data.loadImage import ru.otus.cookbook.databinding.VhRecipeCategoryBinding import ru.otus.cookbook.databinding.VhRecipeItemBinding @@ -27,7 +21,7 @@ class RecipeViewHolder( fun bind(recipe: RecipeListItem.RecipeItem) { with(recipe) { - loadImage() + loadImage(recipeAvatar, imageUrl, CircleCropTransformation()) recipeTitle.text = title recipeDescription.text = description binding.root.setOnClickListener { @@ -36,25 +30,6 @@ class RecipeViewHolder( } } - private fun RecipeListItem.RecipeItem.loadImage() { - recipeAvatar.load(imageUrl) { - setHeader("User-Agent", "Mozilla/5.0") - placeholder(R.drawable.cart_item_icon) - error(R.drawable.ic_launcher_background) - transformations(CircleCropTransformation()) // Optional: Apply transformations - memoryCachePolicy(CachePolicy.ENABLED) // Optional: Enable memory caching - diskCachePolicy(CachePolicy.ENABLED) // Optional: Enable disk caching - listener( - onSuccess = { request: ImageRequest, result: SuccessResult -> - Log.d("Coil", "Image loaded successfully from ${result.dataSource}") - }, - onError = { request: ImageRequest, result: ErrorResult -> - Log.e("Coil", "Image load failed: ${result.throwable.message}") - recipeAvatar.setImageResource(R.drawable.ic_launcher_background) - } - ) - } - } } @@ -64,7 +39,6 @@ class CategoryViewHolder( private val categoryName: TextView = binding.categoryName - fun bind(category: RecipeListItem.CategoryItem) { with(category) { categoryName.text = name diff --git a/app/src/main/res/anim/fade_in.xml b/app/src/main/res/anim/fade_in.xml new file mode 100644 index 0000000..508ed72 --- /dev/null +++ b/app/src/main/res/anim/fade_in.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/fade_out.xml b/app/src/main/res/anim/fade_out.xml new file mode 100644 index 0000000..03533cc --- /dev/null +++ b/app/src/main/res/anim/fade_out.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in.xml b/app/src/main/res/anim/slide_in.xml new file mode 100644 index 0000000..f36cc69 --- /dev/null +++ b/app/src/main/res/anim/slide_in.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out.xml b/app/src/main/res/anim/slide_out.xml new file mode 100644 index 0000000..3e7805c --- /dev/null +++ b/app/src/main/res/anim/slide_out.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable/arrow_left.xml b/app/src/main/res/drawable/arrow_left.xml new file mode 100644 index 0000000..6935245 --- /dev/null +++ b/app/src/main/res/drawable/arrow_left.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/remove_icon.xml b/app/src/main/res/drawable/remove_icon.xml new file mode 100644 index 0000000..a74d7a1 --- /dev/null +++ b/app/src/main/res/drawable/remove_icon.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 1ef71f7..b2d57a6 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -10,8 +10,10 @@ + android:layout_height="match_parent" + app:navGraph="@navigation/recipe_graph" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_cookbook.xml b/app/src/main/res/layout/fragment_cookbook.xml index a67ef3b..269be1e 100644 --- a/app/src/main/res/layout/fragment_cookbook.xml +++ b/app/src/main/res/layout/fragment_cookbook.xml @@ -5,8 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:paddingVertical="20dp" - - > + tools:context="ru.otus.cookbook.ui.CookbookFragment"> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_recipe.xml b/app/src/main/res/layout/fragment_recipe.xml index 77d9ef6..d0aabdd 100644 --- a/app/src/main/res/layout/fragment_recipe.xml +++ b/app/src/main/res/layout/fragment_recipe.xml @@ -1,6 +1,74 @@ + android:layout_height="match_parent" + tools:context="ru.otus.cookbook.ui.RecipeFragment"> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/vh_recipe_item.xml b/app/src/main/res/layout/vh_recipe_item.xml index 965fe07..86da9d5 100644 --- a/app/src/main/res/layout/vh_recipe_item.xml +++ b/app/src/main/res/layout/vh_recipe_item.xml @@ -8,9 +8,7 @@ android:backgroundTintMode="screen" android:paddingVertical="12dp" android:paddingStart="16dp" - android:paddingEnd="24dp" - - > + android:paddingEnd="24dp"> diff --git a/app/src/main/res/menu/recipe_app_bar.xml b/app/src/main/res/menu/recipe_app_bar.xml new file mode 100644 index 0000000..47cae89 --- /dev/null +++ b/app/src/main/res/menu/recipe_app_bar.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/recipe_graph.xml b/app/src/main/res/navigation/recipe_graph.xml index 3fe3501..6377f4d 100644 --- a/app/src/main/res/navigation/recipe_graph.xml +++ b/app/src/main/res/navigation/recipe_graph.xml @@ -1,11 +1,35 @@ + android:label="CookbookFragment" + tools:layout="@layout/fragment_cookbook"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c8524cd..d08e052 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,4 +2,6 @@ #FF000000 #FFFFFFFF + #FEF7FF + #1D1B20 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8fce1d1..b723c4f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,4 @@ Cookbook + Удалить \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1401f31..0421eb0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,9 +2,9 @@ agp = "8.7.3" kotlin = "2.1.0" coreKtx = "1.15.0" -fragmentKtx = "1.8.5" +fragmentKtx = "1.8.9" lifecycleKtx = "2.8.7" -navigation = "2.8.5" +navigation = "2.9.6" junit = "4.13.2" appcompat = "1.7.0" material = "1.12.0" @@ -26,6 +26,7 @@ kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx- androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragmentKtx" } androidx-navigation-fragment = { group = "androidx.navigation", name = "navigation-fragment", version.ref = "navigation" } +androidx-navigation-fragment-ktx ={group="androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigation"} androidx-navigation-ui = { group = "androidx.navigation", name = "navigation-ui", version.ref = "navigation" } navigation-safeargs-gradle = { group = "androidx.navigation", name="navigation-safe-args-gradle-plugin", version.ref = "navigation" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleKtx" } From e5becb9cb1ea1ec2f4db444c897a402be9069180 Mon Sep 17 00:00:00 2001 From: YURY TILMAN Date: Wed, 19 Nov 2025 18:21:48 +0300 Subject: [PATCH 3/5] Task 2 rf displayRecipe with ai --- .../ru/otus/cookbook/ui/RecipeFragment.kt | 21 +++++++++++++++---- app/src/main/res/values/strings.xml | 3 +++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeFragment.kt b/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeFragment.kt index dba6b8c..fe37016 100644 --- a/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeFragment.kt +++ b/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeFragment.kt @@ -13,6 +13,7 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import coil.transform.RoundedCornersTransformation import kotlinx.coroutines.launch +import ru.otus.cookbook.R import ru.otus.cookbook.data.Recipe import ru.otus.cookbook.data.loadImage import ru.otus.cookbook.databinding.FragmentRecipeBinding @@ -38,6 +39,7 @@ class RecipeFragment : Fragment() { savedInstanceState: Bundle? ): View = binding.bind(container, FragmentRecipeBinding::inflate) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.withBinding { @@ -61,10 +63,21 @@ class RecipeFragment : Fragment() { private fun displayRecipe(recipe: Recipe) { binding.withBinding { - loadImage(recipeAvatar, recipe.imageUrl, RoundedCornersTransformation()) - recipeTitle.text = recipe.title - recipeDescription.text = recipe.description - recipeStep.text = recipe.steps.joinToString("\n") + if (recipe.imageUrl.isNotEmpty()) { + loadImage(recipeAvatar, recipe.imageUrl, RoundedCornersTransformation()) + } else { + recipeAvatar.setImageResource(R.drawable.cart_item_icon) + } + + recipeTitle.text = recipe.title.ifEmpty { getString(R.string.no_title) } + recipeDescription.text = + recipe.description.ifEmpty { getString(R.string.no_description) } + + recipeStep.text = if (recipe.steps.isNotEmpty()) { + recipe.steps.joinToString("\n • ", "• ") + } else { + getString(R.string.no_steps) + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b723c4f..578fe68 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,4 +1,7 @@ Cookbook Удалить + Recipe + Recipe description\n + Recipe not available \ No newline at end of file From f2d787ece58bd5b9e397710c71edfca51809531a Mon Sep 17 00:00:00 2001 From: YURY TILMAN Date: Thu, 20 Nov 2025 09:06:12 +0300 Subject: [PATCH 4/5] Task 3 implement --- .../ru/otus/cookbook/ui/RecipeFragment.kt | 43 +++++++++++++++++-- .../ui/dialog/DeleteConfirmationDialog.kt | 40 +++++++++++++++++ app/src/main/res/menu/recipe_app_bar.xml | 6 +-- app/src/main/res/navigation/recipe_graph.xml | 12 ++++++ app/src/main/res/values/strings.xml | 13 ++++-- 5 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 app/src/main/kotlin/ru/otus/cookbook/ui/dialog/DeleteConfirmationDialog.kt diff --git a/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeFragment.kt b/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeFragment.kt index fe37016..46d38eb 100644 --- a/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeFragment.kt +++ b/app/src/main/kotlin/ru/otus/cookbook/ui/RecipeFragment.kt @@ -2,10 +2,13 @@ package ru.otus.cookbook.ui import android.os.Bundle import android.view.LayoutInflater +import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewmodel.MutableCreationExtras @@ -17,6 +20,7 @@ import ru.otus.cookbook.R import ru.otus.cookbook.data.Recipe import ru.otus.cookbook.data.loadImage import ru.otus.cookbook.databinding.FragmentRecipeBinding +import ru.otus.cookbook.ui.dialog.DeleteConfirmationDialog.Companion.CONFIRMATION_RESULT class RecipeFragment : Fragment() { @@ -42,10 +46,10 @@ class RecipeFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + setupAlertDeleteResult() binding.withBinding { - topAppBar.setNavigationOnClickListener { - findNavController().navigate(RecipeFragmentDirections.actionBackToCookbook()) - } + topAppBar.setNavigationOnClickListener(::navigateBackToCookBook) + topAppBar.setOnMenuItemClickListener(::navigateToRemoveDialog) } viewLifecycleOwner.lifecycleScope.launch { model.recipe @@ -54,6 +58,18 @@ class RecipeFragment : Fragment() { } } + private fun navigateToRemoveDialog(menuItem: MenuItem): Boolean = + if (menuItem.itemId == R.id.menu_delete) { + findNavController() + .navigate(RecipeFragmentDirections.actionOpenDeleteConfirmationDialog(getTitle())) + true + } else false + + + private fun navigateBackToCookBook(v: View?) { + findNavController().navigate(RecipeFragmentDirections.actionBackToCookbook()) + } + /** * Use to get recipe title and pass to confirmation dialog */ @@ -81,6 +97,27 @@ class RecipeFragment : Fragment() { } } + private fun setupAlertDeleteResult() { + val navBackStackEntry = findNavController().getBackStackEntry(R.id.recipeFragment) + val observer = object : DefaultLifecycleObserver { + override fun onResume(owner: LifecycleOwner) { + if (navBackStackEntry.savedStateHandle.contains(CONFIRMATION_RESULT)) { + if (true == navBackStackEntry.savedStateHandle.get(CONFIRMATION_RESULT)) + deleteRecipe() + findNavController().popBackStack() + } + } + } + + navBackStackEntry.lifecycle.addObserver(observer) + + viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver { + override fun onDestroy(owner: LifecycleOwner) { + navBackStackEntry.lifecycle.removeObserver(observer) + } + }) + } + private fun deleteRecipe() { model.delete() } diff --git a/app/src/main/kotlin/ru/otus/cookbook/ui/dialog/DeleteConfirmationDialog.kt b/app/src/main/kotlin/ru/otus/cookbook/ui/dialog/DeleteConfirmationDialog.kt new file mode 100644 index 0000000..f39d9d0 --- /dev/null +++ b/app/src/main/kotlin/ru/otus/cookbook/ui/dialog/DeleteConfirmationDialog.kt @@ -0,0 +1,40 @@ +package ru.otus.cookbook.ui.dialog + +import android.app.AlertDialog +import android.app.Dialog +import android.os.Bundle +import androidx.fragment.app.DialogFragment +import androidx.navigation.fragment.findNavController +import ru.otus.cookbook.R + +/** + * Диалог подтверждения удаления рецепта + */ +class DeleteConfirmationDialog : DialogFragment() { + companion object { + const val CONFIRMATION_RESULT = "delete_confirmation_result" + } + + private val recipeName get() = DeleteConfirmationDialogArgs.fromBundle(requireArguments()).recipeName + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = + AlertDialog.Builder(requireContext()) + .setMessage(getString(R.string.delete_recipe_question) + " " + recipeName + "?") + .setTitle(getString(R.string.delete_dialog_title)) + .setPositiveButton(getString(android.R.string.ok)) { _, _ -> + dismiss() + setResult(true) + } + .setNegativeButton(getString(android.R.string.cancel)) { _, _ -> + dismiss() + setResult(false) + } + .create() + + private fun setResult(result: Boolean) { + with(findNavController()) { + previousBackStackEntry?.savedStateHandle?.set(CONFIRMATION_RESULT, result) + findNavController().popBackStack() + } + } +} \ No newline at end of file diff --git a/app/src/main/res/menu/recipe_app_bar.xml b/app/src/main/res/menu/recipe_app_bar.xml index 47cae89..146af15 100644 --- a/app/src/main/res/menu/recipe_app_bar.xml +++ b/app/src/main/res/menu/recipe_app_bar.xml @@ -1,10 +1,10 @@ \ No newline at end of file diff --git a/app/src/main/res/navigation/recipe_graph.xml b/app/src/main/res/navigation/recipe_graph.xml index 6377f4d..a32673d 100644 --- a/app/src/main/res/navigation/recipe_graph.xml +++ b/app/src/main/res/navigation/recipe_graph.xml @@ -27,9 +27,21 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 578fe68..2bccd0b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,12 @@ + Cookbook - Удалить - Recipe - Recipe description\n - Recipe not available + + Без названия + Нет описания + Нет шагов приготовления + Вы действительно хотите удалить + Delete + Remove + Delete \ No newline at end of file From e5a3dfc45fd5c9a7ffe7140278e5ef6b5ba34637 Mon Sep 17 00:00:00 2001 From: YURY TILMAN Date: Thu, 20 Nov 2025 09:32:31 +0300 Subject: [PATCH 5/5] Add launcher icon --- app/src/main/AndroidManifest.xml | 3 +- app/src/main/ic_launcher_cook-playstore.png | Bin 0 -> 17842 bytes .../drawable/ic_launcher_cook_background.xml | 74 ++++++++++++++++++ .../drawable/ic_launcher_cook_foreground.xml | 14 ++++ .../mipmap-anydpi-v26/ic_launcher_cook.xml | 5 ++ .../ic_launcher_cook_round.xml | 5 ++ .../res/mipmap-hdpi/ic_launcher_cook.webp | Bin 0 -> 1370 bytes .../mipmap-hdpi/ic_launcher_cook_round.webp | Bin 0 -> 3028 bytes .../res/mipmap-mdpi/ic_launcher_cook.webp | Bin 0 -> 974 bytes .../mipmap-mdpi/ic_launcher_cook_round.webp | Bin 0 -> 1984 bytes .../res/mipmap-xhdpi/ic_launcher_cook.webp | Bin 0 -> 1832 bytes .../mipmap-xhdpi/ic_launcher_cook_round.webp | Bin 0 -> 4132 bytes .../res/mipmap-xxhdpi/ic_launcher_cook.webp | Bin 0 -> 2756 bytes .../mipmap-xxhdpi/ic_launcher_cook_round.webp | Bin 0 -> 6468 bytes .../res/mipmap-xxxhdpi/ic_launcher_cook.webp | Bin 0 -> 3646 bytes .../ic_launcher_cook_round.webp | Bin 0 -> 9142 bytes .../values/ic_launcher_cook_background.xml | 4 + 17 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 app/src/main/ic_launcher_cook-playstore.png create mode 100644 app/src/main/res/drawable/ic_launcher_cook_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_cook_foreground.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_cook.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_cook_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_cook.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_cook_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_cook.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_cook_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_cook.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_cook_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_cook.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_cook_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_cook.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_cook_round.webp create mode 100644 app/src/main/res/values/ic_launcher_cook_background.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 431aadd..81ce008 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,7 +9,7 @@ android:name=".App" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" - android:icon="@mipmap/ic_launcher" + android:icon="@mipmap/ic_launcher_cook" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" @@ -20,7 +20,6 @@ android:exported="true"> - diff --git a/app/src/main/ic_launcher_cook-playstore.png b/app/src/main/ic_launcher_cook-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..e06dfd748a0bad0cff41d69c9f7ed20f3b6152b1 GIT binary patch literal 17842 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_cook_foreground.xml b/app/src/main/res/drawable/ic_launcher_cook_foreground.xml new file mode 100644 index 0000000..e8e5da8 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_cook_foreground.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cook.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cook.xml new file mode 100644 index 0000000..3983507 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cook.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cook_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cook_round.xml new file mode 100644 index 0000000..3983507 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cook_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_cook.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_cook.webp new file mode 100644 index 0000000000000000000000000000000000000000..53b5a620fb1f5414b6ed4fb00c674fef7e3590da GIT binary patch literal 1370 zcmV-g1*Q5@Nk&Fe1pok7MM6+kP&iCQ1pojqN5Byf716c-|Ii;zY}>YN+qP}nwr$(C zZTo8UJoB45zh6|&Nt+8mWjpx>7w}DGr?PE3yX7W#u-@%#+pSf3%YV1topTtrZR0rT zl#9#bW!bjfw#}Qm$Ky$O0{(IWyn@D}!lKSjfPh*H00QOQ-K}2o4TQ)elIg5KCAlPb zNq5X(1L!*T**KCEr<%wS;QI^G=y!tw!4`lBlNO3F7+)cYQPaiDqd)(a`{w^<-%s!N z`P6RTs6DEU{r>B}g~xPh5PmCtqn`UjS=Bol{Z{p{e(w5nMPMwHq&`+Jt9k{0n6#>s z>5T(~q=h8^OFj8-Wz|ezQlIFbZr17?txEqBae!bK>n&D#2Y-4-t3x?@o9t?b&@nJF zvsaYbHdj~4I6$OL=!BIWKh%)D{#`(u@F_dh?QVp$4xh18UG{cV?bDJB;$0)oYs9@q zsypjo!dz>!*so!zb{Z;Eg^UA0)d1Qn@iK2!<*-#vmZe^(L593^SCr^obPHmrwk@N* zLqr1=Ihv949ysfPm7e{FsJ=3loks!vshTPo3_dY#?Xu4KK zSdeSVGFUr&Cgq(e{MN#vn1Vd4C{;v-W)eMuD7g<&e@D&5p7XI!h={1SqPjLBx)FVTseC`uek%J=AP}%)-1l&7BKl=cARY7Gg zcL3Gos4jpaQlTU8-YFDNiJ+<-RRChdeGNL2-UXtQ8FUJ%C&O^);cJ-pO5w?cOA}XsG#o-0H6t(zkRSf6JDP8?GDh< zEyzKS5S`B8q3%J2RdU>emo4-n&NU9pY3}R+R9{&!61wNb2$G zvOrnOh&O-9&k}X=G98uhxtouMGJxl2L>oPOj{5UcZbla4wf1SkK`pWejMUEGJ``ur zEeN_89nn^aQkp75+@=kQ(hRm&l|}Wv(AlUd*_Mx5TF3y&Hp}J9;4uPJ_MRTpZytiG0MmjH3jVUL;(dFPoMTm?9W685`j=dK`kko2#^}jQ1L`uR$vIwHix+qDB(&uR)ke zUY3TR@7vKmt-`15RE@t8(k6Vy?tiU%{H>5yrbBlBj}>Uogp@nG20MCNVc|rd=$}qO znP0X3dm%uSWH2De0m2-h*;w-a!}%QyI{!lzx-SmUS+P(eRT;C01E^8&jUV<%qI#P_(r8o?0L2HSssI20 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_cook_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_cook_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..d7c147e9e78fe6c806dad4a6b4f2dd587ab6aee7 GIT binary patch literal 3028 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 WYaCeW0@fC&><>OzWdHp%6Z{N8g~S{H literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_cook.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_cook.webp new file mode 100644 index 0000000000000000000000000000000000000000..d175dffbc0a79a7c0c27422ae20869f90cfedfd6 GIT binary patch literal 974 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 SJO*S2)OQc(MNVgj1Of*ASHSrI literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_cook.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_cook.webp new file mode 100644 index 0000000000000000000000000000000000000000..c1e115459f049048f6fbe1307f8b6e8a9e7cd171 GIT binary patch literal 1832 zcmV+@2iN#gNk&E>2LJ$9MM6+kP&iBz2LJ#sU%(d-6^DX=g&^zS8}|f=hzXDhPLU6_ zRI2=cisby?;F$01d1gk(e2(QwcBuHm43e3d8MdbwBR<9Btp zXJ%#++}O5tJh5%tw#%$cz!*(d%JivIC8M!b**3okpd@YoY1_HBZQHhO+qP}nwr$%s zk}<8d{(GJM|BoQ{?%t}{=9d|Kae8doPRmBm=-rIM?4>RT5T|)Dg?Lpd3_ygzA+4X+{(8{`-1~%#sT!7~~g_I~nDY?xD1mYUnNMc_=-#r<5msI0V{@+5h zagwC6pTG&caU*koy@fk+D^@dFT*LG*UB_@q_eLyg!dM zNJK?r_b8`hlv^iA*YcqK#g`^ocXz-KlK|(KVw5}QRn3bnv-Yw50{RwzP zS#T6r()~F|*uB(#ns~n9TcNus_`2mMK zOiD#ESHG`mZ%ZdB=DBk1*|r8suskF*J?XqazJ7o?W^t*V0ciXqcD!jX`rP253hAn9 z*PEcbK6t?OrROTzw_&lq8tgXR+=2usKPO3-1^V7#VMR#eUE@ecrHw{YWbRpEz>?4? zv?PNt?A3E(JDF`30Fk6Gq>Da-;R4fmR3!J;-wo3|ap&EpN(z*W^`QiI%Y4FuLdt~*=i78zUU ze?{`E3-mL!s5r;!5NUAm$NL`3q<{PNyPNMi&(r|`|GYqxAG4&f)w-ExCzRR{qzE+J z%_V?YuUJydF#BMK==Y0EHI804)}F2A?q=4SecQ%IkYU5)#8eay&M?sp?AKoYj6y5$ z!s%{N$&m1iO>_>JdFVs=Jfnj{Hb27KZmP0mUph2% z#S;}=lU{!b871ipf( zLNLOeA4CJ6NG*3!6lR3C-nsE@+E%+va04a1x8{k>I}|f5JOBc14oSbzRA;{#JEX{> zpC(qFLnn8?Cd8D16qV;Nqtz}tOG87`+2kAPHaU*T+wWn|*cgwx88IS{?tqZnw-Q$BW-W2qy=#G;ii`3Roi&GaaeOy?Cvb!c5FOQacrK8bKBnwvU zE3Unrt(yj>`*CBgv091(Wc(FHk1@H1eP5n@eH1M?3zq*t0+1(VkS7W#>P^*O3`GBL zt~5cvH7#sBk8A*hr0e3Co!TaGV>ibKq(G W<%t8EZ=1;7)c@Sp{2$#!>rwz0%9ND= literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_cook_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_cook_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..2033dc7d89e8b0135a9e060defe25e5b7cfbd8c8 GIT binary patch literal 4132 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 KC1w~Tqbmia{yO^r literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_cook_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_cook_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..253bd0a61c50a826ecd7c4ca59c34d108457e710 GIT binary patch literal 6468 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 QD2l4e#;a1Gyj~Xp0Lkv)-v9sr literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cook_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cook_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..6339a16bc9030f3f3aa09000e7c5556028890ae5 GIT binary patch literal 9142 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 AHvj+t literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/ic_launcher_cook_background.xml b/app/src/main/res/values/ic_launcher_cook_background.xml new file mode 100644 index 0000000..67acb6b --- /dev/null +++ b/app/src/main/res/values/ic_launcher_cook_background.xml @@ -0,0 +1,4 @@ + + + #DED4AA + \ No newline at end of file