diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 3fe22b7..91853b6 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -40,6 +40,7 @@ dependencies {
implementation("androidx.constraintlayout:constraintlayout:2.2.1")
implementation("androidx.room:room-ktx:2.7.1")
+ implementation(libs.androidx.activity)
kapt("androidx.room:room-compiler:2.7.1")
testImplementation("junit:junit:4.13.2")
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 28f9a39..6b04610 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -13,6 +13,9 @@
android:supportsRtl="true"
android:theme="@style/Theme.Project"
tools:targetApi="31">
+
@@ -22,11 +25,13 @@
-
-
-
-
-
+
+
+
+
+
+
+
,
+ private val onFavoriteClick: (dish: Dishes) -> Unit
+) : RecyclerView.Adapter() {
+
+ inner class VH(view: View) : RecyclerView.ViewHolder(view) {
+ val imgFood: ImageView = view.findViewById(R.id.imgFood)
+ val imgTag: ImageView = view.findViewById(R.id.imgTag)
+ val imgFavorite: ImageView= view.findViewById(R.id.imgFavorite)
+ val tvTitle: TextView = view.findViewById(R.id.tvTitle)
+ val tvDesc: TextView = view.findViewById(R.id.tvDesc)
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {
+ val view = LayoutInflater.from(parent.context)
+ .inflate(R.layout.item_favorite_food, parent, false)
+ return VH(view)
+ }
+
+ override fun onBindViewHolder(holder: VH, position: Int) {
+ val dish = items[position]
+
+ holder.tvTitle.text = dish.name
+ holder.tvDesc.text = dish.description
+
+ Glide.with(holder.itemView)
+ .load(dish.imageUri)
+ .into(holder.imgFood)
+
+ holder.imgTag.setImageResource(dish.category.iconRes)
+
+ holder.imgFavorite.setImageResource(R.drawable.ic_heart_border)
+ holder.imgFavorite.setOnClickListener { onFavoriteClick(dish) }
+ }
+
+ override fun getItemCount(): Int = items.size
+
+ /** Полностью обновить список избранного */
+ fun updateList(newItems: List) {
+ items.clear()
+ items.addAll(newItems)
+ notifyDataSetChanged()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/projectfigma/Adapters/PromoAdapter.kt b/app/src/main/java/com/example/projectfigma/Adapters/PromoAdapter.kt
index 6ea3eb8..92a04c4 100644
--- a/app/src/main/java/com/example/projectfigma/Adapters/PromoAdapter.kt
+++ b/app/src/main/java/com/example/projectfigma/Adapters/PromoAdapter.kt
@@ -5,21 +5,26 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
+import androidx.cardview.widget.CardView
import androidx.recyclerview.widget.RecyclerView
import com.example.projectfigma.Entites.Dishes
import com.example.projectfigma.R
-class PromoAdapter(private var items: List) :
+class PromoAdapter(
+ private var items: List,
+ private val onBannerClick: () -> Unit) :
RecyclerView.Adapter() {
inner class VH(view: View) : RecyclerView.ViewHolder(view) {
private val image: ImageView = view.findViewById(R.id.promo_image)
private val title: TextView = view.findViewById(R.id.title)
private val discount: TextView = view.findViewById(R.id.discount)
+ private val fullCard: CardView = view.findViewById(R.id.fullCard)
fun bind(item: Dishes) {
title.text = "Experience our delicious new dish"
discount.text = "${30}% OFF"
+ fullCard.setOnClickListener { onBannerClick() }
}
}
diff --git a/app/src/main/java/com/example/projectfigma/Converters/ConvertToDishesCategory.kt b/app/src/main/java/com/example/projectfigma/Converters/ConvertToDishesCategory.kt
new file mode 100644
index 0000000..00b104d
--- /dev/null
+++ b/app/src/main/java/com/example/projectfigma/Converters/ConvertToDishesCategory.kt
@@ -0,0 +1,12 @@
+package com.example.projectfigma.Converters
+
+import androidx.room.TypeConverter
+import com.example.projectfigma.Enums.DishCategory
+
+class ConvertToDishesCategory {
+ @TypeConverter
+ fun fromCategory(cat: DishCategory): String = cat.name
+
+ @TypeConverter
+ fun toCategory(name: String): DishCategory = DishCategory.valueOf(name)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/projectfigma/Converters/ConvertersList.kt b/app/src/main/java/com/example/projectfigma/Converters/ConvertersList.kt
new file mode 100644
index 0000000..37f8820
--- /dev/null
+++ b/app/src/main/java/com/example/projectfigma/Converters/ConvertersList.kt
@@ -0,0 +1,11 @@
+package com.example.projectfigma.Converters
+
+import androidx.room.TypeConverter
+
+class ConvertersList {
+ @TypeConverter
+ fun fromIntList(value: List?): String = value?.joinToString(",") ?: ""
+ @TypeConverter
+ fun toIntList(value: String): List =
+ if (value.isEmpty()) emptyList() else value.split(",").map { it.toInt() }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/projectfigma/Util/Converters.kt b/app/src/main/java/com/example/projectfigma/Converters/ConvertersToDateTime.kt
similarity index 68%
rename from app/src/main/java/com/example/projectfigma/Util/Converters.kt
rename to app/src/main/java/com/example/projectfigma/Converters/ConvertersToDateTime.kt
index 174c8ac..ea9f9ba 100644
--- a/app/src/main/java/com/example/projectfigma/Util/Converters.kt
+++ b/app/src/main/java/com/example/projectfigma/Converters/ConvertersToDateTime.kt
@@ -1,9 +1,10 @@
-package com.example.projectfigma.Util
+package com.example.projectfigma.Converters
import androidx.room.TypeConverter
+import com.example.projectfigma.Enums.DishCategory
import java.util.Date
-class Converters {
+class ConvertersToDateTime {
@TypeConverter
fun fromTimestamp(value: Long?): Date? {
return value?.let { Date(it) }
diff --git a/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt b/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt
index 61cb672..ee99af3 100644
--- a/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt
+++ b/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt
@@ -5,7 +5,9 @@ import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
+import androidx.room.Update
import com.example.projectfigma.Entites.Dishes
+import com.example.projectfigma.Enums.DishCategory
@Dao
interface DishesDao {
@@ -29,4 +31,13 @@ interface DishesDao {
@Query("SELECT * FROM dishes b WHERE b.isRecommend = 1")
fun getRecommend(): LiveData>
+
+ @Query("SELECT * FROM dishes d WHERE d.id = :id")
+ fun getDishById(id : Int) : Dishes
+
+ @Query("SELECT * FROM dishes WHERE id IN (:ids)")
+ fun getDishesByIds(ids: List): List
+
+ @Update
+ suspend fun update(item: Dishes)
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt b/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt
index 24a9c92..0badd54 100644
--- a/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt
+++ b/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt
@@ -2,16 +2,21 @@ package com.example.projectfigma.DAO
import androidx.room.Dao
import androidx.room.Insert
+import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
+import com.example.projectfigma.Entites.Dishes
import com.example.projectfigma.Entites.User
@Dao
interface UserDao {
- @Insert
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertUser(item: User)
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ fun insertAll(items: List)
+
@Update
fun updateUser(user: User)
diff --git a/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt b/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt
index 449ca4d..cf15fbd 100644
--- a/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt
+++ b/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt
@@ -1,11 +1,14 @@
package com.example.projectfigma.DataBase
import android.content.Context
+import android.text.style.TtsSpan
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import androidx.sqlite.db.SupportSQLiteDatabase
+import com.example.projectfigma.Converters.ConvertToDishesCategory
+import com.example.projectfigma.Converters.ConvertersList
import com.example.projectfigma.DAO.DishesDao
import com.example.projectfigma.DAO.SettingsDao
import com.example.projectfigma.DAO.SessionDao
@@ -14,18 +17,24 @@ import com.example.projectfigma.Entites.AppSettings
import com.example.projectfigma.Entites.Dishes
import com.example.projectfigma.Entites.Session
import com.example.projectfigma.Entites.User
+import com.example.projectfigma.Enums.DishCategory
import com.example.projectfigma.R
-import com.example.projectfigma.Util.Converters
+import com.example.projectfigma.Converters.ConvertersToDateTime
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
+import java.util.Date
@Database(
entities = [User::class, Dishes::class, Session::class, AppSettings::class],
- version = 4
+ version = 6
+)
+@TypeConverters(
+ ConvertersToDateTime::class,
+ ConvertToDishesCategory::class,
+ ConvertersList::class
)
-@TypeConverters(Converters::class)
abstract class DataBase : RoomDatabase() {
abstract fun getUserDao(): UserDao
@@ -39,48 +48,87 @@ abstract class DataBase : RoomDatabase() {
private val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
+ private fun prepopulateUsers(): List = listOf(
+ User(
+ name = "TestUser",
+ gmail = "test@yandex.ru",
+ password = "1111",
+ mobileNumber = "818412481",
+ dateOfBirth = Date(),
+ favoriteDishesId = listOf(1,2,3)
+ )
+ )
+
private fun prepopulateBestSellers(packageName: String) = listOf(
Dishes(
imageUri = "android.resource://$packageName/${R.drawable.best_seller_card_1}",
price = 103.0,
isBestSeller = true,
isRecommend = false,
- rating = 3.0
+ rating = 3.0,
+ name = "Суши",
+ description = "Суши",
+ category = DishCategory.MEAL
),
Dishes(
imageUri = "android.resource://$packageName/${R.drawable.best_seller_card_2}",
price = 50.0,
isBestSeller = true,
isRecommend = false,
- rating = 4.0
+ rating = 4.0,
+ name = "Рис с курицей",
+ description = "Рис с курицей в подливе",
+ category = DishCategory.MEAL
),
Dishes(
imageUri = "android.resource://$packageName/${R.drawable.best_seller_card_3}",
price = 12.99,
isBestSeller = true,
isRecommend = false,
- rating = 4.0
+ rating = 4.0,
+ name = "Лазанья",
+ description = "Лазанья",
+ category = DishCategory.VEGAN
),
Dishes(
imageUri = "android.resource://$packageName/${R.drawable.best_seller_card_4}",
price = 8.20,
isBestSeller = true,
isRecommend = false,
- rating = 4.0
+ rating = 4.0,
+ name = "Пироженное",
+ description = "Пироженное",
+ category = DishCategory.DESERT
),
Dishes(
imageUri = "android.resource://$packageName/${R.drawable.burger}",
price = 10.0,
isBestSeller = false,
isRecommend = true,
- rating = 5.0
+ rating = 5.0,
+ name = "Бургер",
+ description = "Бургер",
+ category = DishCategory.MEAL
),
Dishes(
imageUri = "android.resource://$packageName/${R.drawable.roll}",
price = 25.0,
isBestSeller = false,
isRecommend = true,
- rating = 5.0
+ rating = 5.0,
+ name = "Роллы",
+ description = "Роллы",
+ category = DishCategory.VEGAN
+ ),
+ Dishes(
+ imageUri = "android.resource://$packageName/${R.drawable.roll}",
+ price = 25.0,
+ isBestSeller = false,
+ isRecommend = true,
+ rating = 5.0,
+ name = "Роллы",
+ description = "Роллы",
+ category = DishCategory.VEGAN
)
)
@@ -101,10 +149,16 @@ abstract class DataBase : RoomDatabase() {
applicationScope.launch {
val database = getDb(appContext)
- val bestSellerDao = database.getDishesDao()
- if (bestSellerDao.getAll().isEmpty()) {
- bestSellerDao.insertAll(prepopulateBestSellers(pkg))
+ val dishesDao = database.getDishesDao()
+ if (dishesDao.getAll().isEmpty()) {
+ dishesDao.insertAll(prepopulateBestSellers(pkg))
}
+
+ val userDao = database.getUserDao()
+ if (userDao.getAllUsers().isEmpty()) {
+ userDao.insertAll(prepopulateUsers())
+ }
+
val settingsDao = database.getSettingsDao()
settingsDao.upsert(AppSettings(id = 0, isFirstRun = true))
diff --git a/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt b/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt
index 5754f71..cee6616 100644
--- a/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt
+++ b/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt
@@ -2,6 +2,7 @@ package com.example.projectfigma.Entites
import androidx.room.Entity
import androidx.room.PrimaryKey
+import com.example.projectfigma.Enums.DishCategory
@Entity(tableName = "dishes")
data class Dishes(
@@ -10,5 +11,8 @@ data class Dishes(
val price: Double,
val rating: Double,
val isRecommend: Boolean,
- val isBestSeller: Boolean
+ val isBestSeller: Boolean,
+ val name: String,
+ val description: String,
+ val category: DishCategory
)
\ No newline at end of file
diff --git a/app/src/main/java/com/example/projectfigma/Entites/User.kt b/app/src/main/java/com/example/projectfigma/Entites/User.kt
index 2d252a6..b21ced1 100644
--- a/app/src/main/java/com/example/projectfigma/Entites/User.kt
+++ b/app/src/main/java/com/example/projectfigma/Entites/User.kt
@@ -18,5 +18,6 @@ data class User(
@ColumnInfo(name = "mobileNumber")
var mobileNumber : String,
@ColumnInfo(name = "dateOfBirth")
- var dateOfBirth : Date
+ var dateOfBirth : Date,
+ var favoriteDishesId: List
)
diff --git a/app/src/main/java/com/example/projectfigma/Enums/DishCategory.kt b/app/src/main/java/com/example/projectfigma/Enums/DishCategory.kt
new file mode 100644
index 0000000..529f2e1
--- /dev/null
+++ b/app/src/main/java/com/example/projectfigma/Enums/DishCategory.kt
@@ -0,0 +1,12 @@
+package com.example.projectfigma.Enums
+
+import androidx.annotation.DrawableRes
+import com.example.projectfigma.R
+
+enum class DishCategory(val displayName: String, @DrawableRes val iconRes: Int) {
+ MEAL("Обычная", R.drawable.ic_meal),
+ VEGAN("Вегатарианская", R.drawable.ic_vegan),
+ SNACKS("Снэки", R.drawable.ic_snacks),
+ DESERT("Десерт", R.drawable.ic_dessert),
+ DRINKS("Напиток", R.drawable.ic_drinks)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt b/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt
index 56d489c..54f85e8 100644
--- a/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt
+++ b/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt
@@ -1,5 +1,6 @@
package com.example.projectfigma.Fragments
+import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.os.Looper
@@ -7,7 +8,10 @@ import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.widget.ViewPager2
+import com.example.projectfigma.Activity.AdverstsingPageActivity
+import com.example.projectfigma.Activity.LogActivity
import com.example.projectfigma.Adapters.PromoAdapter
import com.example.projectfigma.DataBase.DataBase
import com.example.projectfigma.R
@@ -15,71 +19,73 @@ import com.example.projectfigma.databinding.FragmentBannerFoodBinding
import com.example.projectfigma.databinding.FragmentBestSellerBinding
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.isActive
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
class BannerFood : Fragment() {
private var _binding: FragmentBannerFoodBinding? = null
private val binding get() = _binding!!
private lateinit var promoAdapter: PromoAdapter
-
- override fun onCreate(savedInstanceState: Bundle?) {
-
- super.onCreate(savedInstanceState)
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentBannerFoodBinding.inflate(inflater, container, false)
+ return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 1) Инициализируем адаптер
- promoAdapter = PromoAdapter(emptyList())
+ promoAdapter = PromoAdapter(emptyList()) {
+ val intent = Intent(requireContext(), AdverstsingPageActivity::class.java)
+ startActivity(intent)
+ requireActivity().finish()
+ }
binding.viewPager.adapter = promoAdapter
// 2) Настраиваем TabLayoutMediator, сразу задаём иконки
TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, _ ->
- tab.setIcon(R.drawable.tab_indicator_unselected)
+ tab.setIcon(com.example.projectfigma.R.drawable.tab_indicator_unselected)
}.attach()
- // 3) Подписываемся на смену вкладки, чтобы менять иконки
+ // 3) Слушаем смену вкладки для изменения иконки
binding.tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
- tab.setIcon(R.drawable.tab_indicator_selected)
+ tab.setIcon(com.example.projectfigma.R.drawable.tab_indicator_selected)
}
override fun onTabUnselected(tab: TabLayout.Tab) {
- tab.setIcon(R.drawable.tab_indicator_unselected)
+ tab.setIcon(com.example.projectfigma.R.drawable.tab_indicator_unselected)
}
override fun onTabReselected(tab: TabLayout.Tab) {}
})
- // 4) Тут же можете запустить автопрокрутку, если она нужна в фрагменте
- val handler = Handler(Looper.getMainLooper())
- handler.postDelayed(object : Runnable {
- override fun run() {
+ // 4) Автопрокрутка с помощью корутины
+ viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Main) {
+ while (isActive) {
+ delay(4000)
if (promoAdapter.itemCount > 1) {
val next = (binding.viewPager.currentItem + 1) % promoAdapter.itemCount
binding.viewPager.setCurrentItem(next, true)
}
- handler.postDelayed(this, 4000)
}
- }, 4000)
+ }
- // 5) А обновление списка (LiveData) можно тоже повесить здесь:
+ // 5) Обновление списка из БД
val dao = DataBase.getDb(requireContext()).getDishesDao()
dao.getBestSellers().observe(viewLifecycleOwner) { list ->
promoAdapter.updateList(list)
}
}
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View {
- _binding = FragmentBannerFoodBinding.inflate(inflater, container, false)
- return binding.root
- }
-
override fun onDestroyView() {
super.onDestroyView()
_binding = null
diff --git a/app/src/main/java/com/example/projectfigma/Fragments/BottomPanelActivity.kt b/app/src/main/java/com/example/projectfigma/Fragments/BottomPanelActivity.kt
index 342efb1..48a43a5 100644
--- a/app/src/main/java/com/example/projectfigma/Fragments/BottomPanelActivity.kt
+++ b/app/src/main/java/com/example/projectfigma/Fragments/BottomPanelActivity.kt
@@ -6,6 +6,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.fragment.app.Fragment
+import com.example.projectfigma.Activity.FavoritesActivity
import com.example.projectfigma.Activity.HomeActivity
import com.example.projectfigma.R
@@ -15,7 +16,7 @@ class BottomPanelFragment : Fragment() {
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
- ): View? = inflater.inflate(R.layout.activity_bottom_panel, container, false)
+ ): View? = inflater.inflate(R.layout.fragment_bottom_panel, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -27,13 +28,13 @@ class BottomPanelFragment : Fragment() {
val navSupport = view.findViewById(R.id.nav_support)
navHome .setOnClickListener { openActivity(HomeActivity::class.java) }
- /**
- navFood .setOnClickListener { openActivity(FoodActivity::class.java) }
navFav .setOnClickListener { openActivity(FavoritesActivity::class.java) }
+ /**
+ navFood .setOnClickListener { openActivity(FoodActivity::class.java) }
navList .setOnClickListener { openActivity(OrdersActivity::class.java) }
navSupport .setOnClickListener { openActivity(SupportActivity::class.java) }
- **/
- }
+ **/
+ }
private fun openActivity(activityClass: Class) {
val ctx = requireContext()
diff --git a/app/src/main/java/com/example/projectfigma/Fragments/FavoriteListFragment.kt b/app/src/main/java/com/example/projectfigma/Fragments/FavoriteListFragment.kt
new file mode 100644
index 0000000..8f55b5b
--- /dev/null
+++ b/app/src/main/java/com/example/projectfigma/Fragments/FavoriteListFragment.kt
@@ -0,0 +1,98 @@
+ package com.example.projectfigma.Fragments
+
+ import android.content.Context
+ import android.os.Build
+ import android.os.Bundle
+ import androidx.fragment.app.Fragment
+ import android.view.LayoutInflater
+ import android.view.View
+ import android.view.ViewGroup
+ import androidx.annotation.RequiresApi
+ import androidx.lifecycle.lifecycleScope
+ import androidx.recyclerview.widget.GridLayoutManager
+ import androidx.recyclerview.widget.RecyclerView
+ import com.example.projectfigma.Adapters.FavoriteFoodAdapter
+ import com.example.projectfigma.DataBase.DataBase
+ import com.example.projectfigma.Entites.Dishes
+ import com.example.projectfigma.Entites.User
+ import com.example.projectfigma.R
+ import com.example.projectfigma.databinding.FragmentBestSellerBinding
+ import com.example.projectfigma.databinding.FragmentFavoriteListBinding
+ import kotlinx.coroutines.Dispatchers
+ import kotlinx.coroutines.launch
+ import kotlinx.coroutines.withContext
+
+ class FavoriteListFragment : Fragment(R.layout.fragment_favorite_list) {
+
+ private var _binding: FragmentFavoriteListBinding? = null
+ private val binding get() = _binding!!
+
+ private lateinit var adapter: FavoriteFoodAdapter
+ private var currentUser: User? = null
+ private lateinit var dataBase: DataBase
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentFavoriteListBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ dataBase = DataBase.getDb(context)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ // 1) Загрузить текущего пользователя из БД
+ lifecycleScope.launch(Dispatchers.IO) {
+ currentUser = dataBase
+ .getUserDao().getUserByEmail(
+ dataBase.getSessionDao().getSession()?.userEmail.toString()
+ )
+ withContext(Dispatchers.Main) {
+ setupRecycler()
+ loadFavorites()
+ }
+ }
+ }
+ private fun setupRecycler() {
+ adapter = FavoriteFoodAdapter(mutableListOf()) { dish ->
+ currentUser?.let { user ->
+ // 2) Удаляем ID блюда из списка
+ val newList = user.favoriteDishesId.toMutableList()
+ newList.remove(dish.id.toInt())
+ user.favoriteDishesId = newList
+ // 3) Сохраняем пользователя в БД и обновляем UI
+ lifecycleScope.launch(Dispatchers.IO) {
+ DataBase.getDb(requireContext()).getUserDao().updateUser(user)
+ val all = DataBase.getDb(requireContext()).getDishesDao().getAll()
+ val fav = all.filter { it.id.toInt() in newList }
+ withContext(Dispatchers.Main) { adapter.updateList(fav) }
+ }
+ }
+ }
+ binding.rvFoods.layoutManager = GridLayoutManager(requireContext(), 2)
+ binding.rvFoods.adapter = adapter
+ }
+
+ private fun loadFavorites() {
+ currentUser?.let { user ->
+ lifecycleScope.launch(Dispatchers.IO) {
+ val all = dataBase.getDishesDao().getDishesByIds(user.favoriteDishesId)
+ println(" FFFFFFFFFFFFFFFF " + all.toString())
+ println(" FFFFFFFFFFFFFFFF " + user)
+ withContext(Dispatchers.Main) { adapter.updateList(all) }
+ }
+ }
+ }
+
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+ }
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_rating.xml b/app/src/main/res/drawable/bg_rating.xml
index 3dea9c6..0c63dd9 100644
--- a/app/src/main/res/drawable/bg_rating.xml
+++ b/app/src/main/res/drawable/bg_rating.xml
@@ -1,4 +1,4 @@
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_rating_orange.xml b/app/src/main/res/drawable/bg_rating_orange.xml
new file mode 100644
index 0000000..da9d1a2
--- /dev/null
+++ b/app/src/main/res/drawable/bg_rating_orange.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/bg_skibidi_tualet.xml b/app/src/main/res/drawable/bg_skibidi_tualet.xml
new file mode 100644
index 0000000..ee75929
--- /dev/null
+++ b/app/src/main/res/drawable/bg_skibidi_tualet.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_add_to_card.png b/app/src/main/res/drawable/ic_add_to_card.png
new file mode 100644
index 0000000..f0cd87e
Binary files /dev/null and b/app/src/main/res/drawable/ic_add_to_card.png differ
diff --git a/app/src/main/res/drawable/ic_dessert.png b/app/src/main/res/drawable/ic_dessert.png
new file mode 100644
index 0000000..b4d5e66
Binary files /dev/null and b/app/src/main/res/drawable/ic_dessert.png differ
diff --git a/app/src/main/res/drawable/ic_discount_30.png b/app/src/main/res/drawable/ic_discount_30.png
new file mode 100644
index 0000000..4483ec2
Binary files /dev/null and b/app/src/main/res/drawable/ic_discount_30.png differ
diff --git a/app/src/main/res/drawable/ic_drinks.png b/app/src/main/res/drawable/ic_drinks.png
new file mode 100644
index 0000000..411c41b
Binary files /dev/null and b/app/src/main/res/drawable/ic_drinks.png differ
diff --git a/app/src/main/res/drawable/ic_heart_border.png b/app/src/main/res/drawable/ic_heart_border.png
new file mode 100644
index 0000000..cbf94dc
Binary files /dev/null and b/app/src/main/res/drawable/ic_heart_border.png differ
diff --git a/app/src/main/res/drawable/ic_heart_in_circle.png b/app/src/main/res/drawable/ic_heart_in_circle.png
new file mode 100644
index 0000000..49217e6
Binary files /dev/null and b/app/src/main/res/drawable/ic_heart_in_circle.png differ
diff --git a/app/src/main/res/drawable/ic_heart_unborder.png b/app/src/main/res/drawable/ic_heart_unborder.png
new file mode 100644
index 0000000..b29230d
Binary files /dev/null and b/app/src/main/res/drawable/ic_heart_unborder.png differ
diff --git a/app/src/main/res/drawable/ic_meal.png b/app/src/main/res/drawable/ic_meal.png
new file mode 100644
index 0000000..f0665fe
Binary files /dev/null and b/app/src/main/res/drawable/ic_meal.png differ
diff --git a/app/src/main/res/drawable/ic_minus.png b/app/src/main/res/drawable/ic_minus.png
new file mode 100644
index 0000000..23908c0
Binary files /dev/null and b/app/src/main/res/drawable/ic_minus.png differ
diff --git a/app/src/main/res/drawable/ic_plus.png b/app/src/main/res/drawable/ic_plus.png
new file mode 100644
index 0000000..aba45e0
Binary files /dev/null and b/app/src/main/res/drawable/ic_plus.png differ
diff --git a/app/src/main/res/drawable/ic_snacks.png b/app/src/main/res/drawable/ic_snacks.png
new file mode 100644
index 0000000..8077292
Binary files /dev/null and b/app/src/main/res/drawable/ic_snacks.png differ
diff --git a/app/src/main/res/drawable/ic_vegan.png b/app/src/main/res/drawable/ic_vegan.png
new file mode 100644
index 0000000..5b8100c
Binary files /dev/null and b/app/src/main/res/drawable/ic_vegan.png differ
diff --git a/app/src/main/res/layout/activity_advertising_page.xml b/app/src/main/res/layout/activity_advertising_page.xml
new file mode 100644
index 0000000..01f1994
--- /dev/null
+++ b/app/src/main/res/layout/activity_advertising_page.xml
@@ -0,0 +1,433 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_favorites.xml b/app/src/main/res/layout/activity_favorites.xml
new file mode 100644
index 0000000..0b0fbe2
--- /dev/null
+++ b/app/src/main/res/layout/activity_favorites.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_forget_password.xml b/app/src/main/res/layout/activity_forget_password.xml
index 0361c25..0f2d0db 100644
--- a/app/src/main/res/layout/activity_forget_password.xml
+++ b/app/src/main/res/layout/activity_forget_password.xml
@@ -119,7 +119,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_banner.xml b/app/src/main/res/layout/item_banner.xml
index 2cd74b0..ed9debb 100644
--- a/app/src/main/res/layout/item_banner.xml
+++ b/app/src/main/res/layout/item_banner.xml
@@ -1,5 +1,6 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_food.xml b/app/src/main/res/layout/item_food.xml
index 1053fe7..e5ea760 100644
--- a/app/src/main/res/layout/item_food.xml
+++ b/app/src/main/res/layout/item_food.xml
@@ -34,10 +34,6 @@
app:layout_constraintStart_toStartOf="parent"
android:layout_margin="8dp">
-
+
+
+
diff --git a/build.gradle.kts b/build.gradle.kts
index 5d68f11..891e8ae 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,6 +1,6 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
- id("com.android.application") version "8.9.2" apply false
- id("com.android.library") version "8.9.2" apply false
+ id("com.android.application") version "8.9.0" apply false
+ id("com.android.library") version "8.9.0" apply false
id("org.jetbrains.kotlin.android") version "2.1.20" apply false
}
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 2c177a0..5cf5bcd 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Sun May 04 14:55:53 MSK 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists