diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 28f9a39..9ce032b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -27,6 +27,7 @@
+
(R.id.rvFoods).apply {
+ layoutManager = GridLayoutManager(context, 2)
+ }
+
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.buttonPanel, BottomPanelFragment())
+ .commit()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt b/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt
index 836bfe7..60a87ba 100644
--- a/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt
+++ b/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt
@@ -8,10 +8,10 @@ import androidx.drawerlayout.widget.DrawerLayout
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.projectfigma.Adapters.BestSellerAdapter
-import com.example.projectfigma.DAO.BestSellerDao
+import com.example.projectfigma.DAO.DishesDao
import com.example.projectfigma.DAO.UserDao
import com.example.projectfigma.DataBase.DataBase
-import com.example.projectfigma.Entites.BestSeller
+import com.example.projectfigma.Entites.Dishes
import com.example.projectfigma.Entites.User
import com.example.projectfigma.Fragments.*
import com.example.projectfigma.R
@@ -21,11 +21,11 @@ class HomeActivity : AppCompatActivity(),
HeaderButtonsFragment.Listener {
private lateinit var adapter: BestSellerAdapter
- private lateinit var dao: BestSellerDao
+ private lateinit var dao: DishesDao
private lateinit var userDao: UserDao
private lateinit var drawer: DrawerLayout
- private lateinit var user: User
+ private var user: User? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -35,7 +35,7 @@ class HomeActivity : AppCompatActivity(),
drawer = findViewById(R.id.drawer_layout)
val db = DataBase.getDb(this)
- dao = db.getBestSellerDao()
+ dao = db.getDishesDao()
userDao = db.getUserDao()
val email = intent.getStringExtra("user_email")
@@ -49,7 +49,7 @@ class HomeActivity : AppCompatActivity(),
LinearLayoutManager.HORIZONTAL,
false
)
- adapter = BestSellerAdapter(emptyList()) { item: BestSeller ->
+ adapter = BestSellerAdapter(emptyList()) { item: Dishes ->
Toast.makeText(
this@HomeActivity,
"Clicked: ${item.price}",
@@ -58,7 +58,7 @@ class HomeActivity : AppCompatActivity(),
}.also { this@HomeActivity.adapter = it }
}
- dao.getAllV().observe(this) { list ->
+ dao.getBestSellersWithLimit(4).observe(this) { list ->
adapter.updateList(list)
}
@@ -89,8 +89,8 @@ class HomeActivity : AppCompatActivity(),
.commitNow()
profileMenu.setUserData(
- name = user.name,
- email = user.gmail,
+ name = user?.name.takeUnless { it.isNullOrBlank() } ?: "Гость",
+ email = user?.gmail.takeUnless { it.isNullOrBlank() } ?: "Не указано",
avatarRes = R.drawable.ic_profile_placeholder
)
diff --git a/app/src/main/java/com/example/projectfigma/Adapters/BestSellerAdapter.kt b/app/src/main/java/com/example/projectfigma/Adapters/BestSellerAdapter.kt
index a27613d..0a02bb3 100644
--- a/app/src/main/java/com/example/projectfigma/Adapters/BestSellerAdapter.kt
+++ b/app/src/main/java/com/example/projectfigma/Adapters/BestSellerAdapter.kt
@@ -7,19 +7,19 @@ import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
-import com.example.projectfigma.Entites.BestSeller
+import com.example.projectfigma.Entites.Dishes
import com.example.projectfigma.R
class BestSellerAdapter(
- private var items: List,
- private val onClick: (BestSeller) -> Unit
+ private var items: List,
+ private val onClick: (Dishes) -> Unit
) : RecyclerView.Adapter() {
inner class VH(view: View) : RecyclerView.ViewHolder(view) {
private val ivFood: ImageView = view.findViewById(R.id.ivFood)
private val tvPrice: TextView = view.findViewById(R.id.tvPrice)
- fun bind(item: BestSeller) {
+ fun bind(item: Dishes) {
tvPrice.text = String.format("$%.2f", item.price)
Glide.with(ivFood.context)
.load(item.imageUri)
@@ -40,7 +40,7 @@ class BestSellerAdapter(
holder.bind(items[position])
}
- fun updateList(newItems: List) {
+ fun updateList(newItems: List) {
items = newItems
notifyDataSetChanged()
}
diff --git a/app/src/main/java/com/example/projectfigma/Adapters/FavoriteDishesAdapter.kt b/app/src/main/java/com/example/projectfigma/Adapters/FavoriteDishesAdapter.kt
new file mode 100644
index 0000000..62b7beb
--- /dev/null
+++ b/app/src/main/java/com/example/projectfigma/Adapters/FavoriteDishesAdapter.kt
@@ -0,0 +1,57 @@
+package com.example.projectfigma.Adapters
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.example.projectfigma.Entites.Dishes
+import com.example.projectfigma.R
+
+class FavoriteFoodAdapter(
+ private val items: MutableList
+) : 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)
+ }
+
+ 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 3545b5a..6ea3eb8 100644
--- a/app/src/main/java/com/example/projectfigma/Adapters/PromoAdapter.kt
+++ b/app/src/main/java/com/example/projectfigma/Adapters/PromoAdapter.kt
@@ -6,11 +6,10 @@ import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
-import coil.load
-import com.example.projectfigma.Entites.BestSeller
+import com.example.projectfigma.Entites.Dishes
import com.example.projectfigma.R
-class PromoAdapter(private var items: List) :
+class PromoAdapter(private var items: List) :
RecyclerView.Adapter() {
inner class VH(view: View) : RecyclerView.ViewHolder(view) {
@@ -18,7 +17,7 @@ class PromoAdapter(private var items: List) :
private val title: TextView = view.findViewById(R.id.title)
private val discount: TextView = view.findViewById(R.id.discount)
- fun bind(item: BestSeller) {
+ fun bind(item: Dishes) {
title.text = "Experience our delicious new dish"
discount.text = "${30}% OFF"
}
@@ -37,7 +36,7 @@ class PromoAdapter(private var items: List) :
override fun getItemCount(): Int = items.size
/** Вызываем из Activity/Fragment при получении новых данных */
- fun updateList(newItems: List) {
+ fun updateList(newItems: List) {
items = newItems
notifyDataSetChanged()
}
diff --git a/app/src/main/java/com/example/projectfigma/Adapters/RecommendAdapter.kt b/app/src/main/java/com/example/projectfigma/Adapters/RecommendAdapter.kt
new file mode 100644
index 0000000..85f6cb6
--- /dev/null
+++ b/app/src/main/java/com/example/projectfigma/Adapters/RecommendAdapter.kt
@@ -0,0 +1,40 @@
+package com.example.projectfigma.Adapters
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.example.projectfigma.Entites.Dishes
+import com.example.projectfigma.R
+
+class RecommendAdapter (
+ private val items: List
+) : RecyclerView.Adapter() {
+
+ inner class VH(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ private val ivFood: ImageView = itemView.findViewById(R.id.ivFood)
+ private val tvRating: TextView = itemView.findViewById(R.id.tvRating)
+ private val tvPrice: TextView = itemView.findViewById(R.id.tvPrice)
+
+ fun bind(food: Dishes) {
+ Glide.with(itemView).load(food.imageUri).into(ivFood)
+ tvRating.text = String.format("%.1f", food.rating)
+ tvPrice.text = "$${String.format("%.2f", food.price)}"
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {
+ val view = LayoutInflater.from(parent.context)
+ .inflate(R.layout.item_food, parent, false)
+ return VH(view)
+ }
+
+ override fun onBindViewHolder(holder: VH, position: Int) {
+ holder.bind(items[position])
+ }
+
+ override fun getItemCount(): Int = items.size
+}
\ No newline at end of file
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/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/BestSellerDao.kt b/app/src/main/java/com/example/projectfigma/DAO/BestSellerDao.kt
deleted file mode 100644
index ee72c79..0000000
--- a/app/src/main/java/com/example/projectfigma/DAO/BestSellerDao.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.example.projectfigma.DAO
-
-import androidx.lifecycle.LiveData
-import androidx.room.Dao
-import androidx.room.Insert
-import androidx.room.OnConflictStrategy
-import androidx.room.Query
-import com.example.projectfigma.Entites.BestSeller
-
-@Dao
-interface BestSellerDao {
- @Query("SELECT * FROM best_seller")
- fun getAll(): List
-
- // Вставить один объект
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- suspend fun insert(item: BestSeller)
-
- // Вставить список объектов
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- suspend fun insertAll(items: List)
-
- @Query("SELECT * FROM best_seller")
- fun getAllV(): LiveData>
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt b/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt
new file mode 100644
index 0000000..f59e898
--- /dev/null
+++ b/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt
@@ -0,0 +1,36 @@
+package com.example.projectfigma.DAO
+
+import androidx.lifecycle.LiveData
+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
+
+@Dao
+interface DishesDao {
+ @Query("SELECT * FROM dishes")
+ fun getAll(): List
+
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ suspend fun insert(item: Dishes)
+
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ suspend fun insertAll(items: List)
+
+ @Query("SELECT * FROM dishes")
+ fun getAllV(): LiveData>
+
+ @Query("SELECT * FROM dishes b WHERE b.isBestSeller = 1")
+ fun getBestSellers(): LiveData>
+
+ @Query("SELECT * FROM dishes b WHERE b.isBestSeller = 1 LIMIT :limit")
+ fun getBestSellersWithLimit(limit : Int): LiveData>
+
+ @Query("SELECT * FROM dishes b WHERE b.isRecommend = 1")
+ fun getRecommend(): LiveData>
+
+ @Update
+ suspend fun update(item: Dishes)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/projectfigma/DAO/SessionDao.kt b/app/src/main/java/com/example/projectfigma/DAO/SessionDao.kt
index 23c6c2c..58bb266 100644
--- a/app/src/main/java/com/example/projectfigma/DAO/SessionDao.kt
+++ b/app/src/main/java/com/example/projectfigma/DAO/SessionDao.kt
@@ -9,7 +9,7 @@ import com.example.projectfigma.Entites.Session
@Dao
interface SessionDao {
@Query("SELECT * FROM session WHERE id = 0")
- suspend fun getSession(): Session?
+ fun getSession(): Session?
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun upsert(session: Session)
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 480d7ed..497b03d 100644
--- a/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt
+++ b/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt
@@ -6,30 +6,32 @@ import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import androidx.sqlite.db.SupportSQLiteDatabase
-import com.example.projectfigma.DAO.BestSellerDao
+import com.example.projectfigma.Converters.ConvertToDishesCategory
+import com.example.projectfigma.DAO.DishesDao
import com.example.projectfigma.DAO.SettingsDao
import com.example.projectfigma.DAO.SessionDao
import com.example.projectfigma.DAO.UserDao
import com.example.projectfigma.Entites.AppSettings
-import com.example.projectfigma.Entites.BestSeller
+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
@Database(
- entities = [User::class, BestSeller::class, Session::class, AppSettings::class],
- version = 3
+ entities = [User::class, Dishes::class, Session::class, AppSettings::class],
+ version = 5
)
-@TypeConverters(Converters::class)
+@TypeConverters(ConvertersToDateTime::class, ConvertToDishesCategory::class)
abstract class DataBase : RoomDatabase() {
abstract fun getUserDao(): UserDao
- abstract fun getBestSellerDao(): BestSellerDao
+ abstract fun getDishesDao(): DishesDao
abstract fun getSessionDao(): SessionDao
abstract fun getSettingsDao(): SettingsDao
@@ -40,21 +42,65 @@ abstract class DataBase : RoomDatabase() {
private val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
private fun prepopulateBestSellers(packageName: String) = listOf(
- BestSeller(
+ Dishes(
imageUri = "android.resource://$packageName/${R.drawable.best_seller_card_1}",
- price = 103.0
+ price = 103.0,
+ isBestSeller = true,
+ isRecommend = false,
+ rating = 3.0,
+ name = "Суши",
+ description = "Суши",
+ category = DishCategory.MEAL
),
- BestSeller(
+ Dishes(
imageUri = "android.resource://$packageName/${R.drawable.best_seller_card_2}",
- price = 50.0
+ price = 50.0,
+ isBestSeller = true,
+ isRecommend = false,
+ rating = 4.0,
+ name = "Рис с курицей",
+ description = "Рис с курицей в подливе",
+ category = DishCategory.MEAL
),
- BestSeller(
+ Dishes(
imageUri = "android.resource://$packageName/${R.drawable.best_seller_card_3}",
- price = 12.99
+ price = 12.99,
+ isBestSeller = true,
+ isRecommend = false,
+ rating = 4.0,
+ name = "Лазанья",
+ description = "Лазанья",
+ category = DishCategory.VEGAN
),
- BestSeller(
+ Dishes(
imageUri = "android.resource://$packageName/${R.drawable.best_seller_card_4}",
- price = 8.20
+ price = 8.20,
+ isBestSeller = true,
+ isRecommend = false,
+ 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,
+ name = "Бургер",
+ description = "Бургер",
+ category = DishCategory.MEAL
+ ),
+ Dishes(
+ imageUri = "android.resource://$packageName/${R.drawable.roll}",
+ price = 25.0,
+ isBestSeller = false,
+ isRecommend = true,
+ rating = 5.0,
+ name = "Роллы",
+ description = "Роллы",
+ category = DishCategory.VEGAN
)
)
@@ -75,7 +121,7 @@ abstract class DataBase : RoomDatabase() {
applicationScope.launch {
val database = getDb(appContext)
- val bestSellerDao = database.getBestSellerDao()
+ val bestSellerDao = database.getDishesDao()
if (bestSellerDao.getAll().isEmpty()) {
bestSellerDao.insertAll(prepopulateBestSellers(pkg))
}
diff --git a/app/src/main/java/com/example/projectfigma/Entites/BestSeller.kt b/app/src/main/java/com/example/projectfigma/Entites/BestSeller.kt
deleted file mode 100644
index 1197d61..0000000
--- a/app/src/main/java/com/example/projectfigma/Entites/BestSeller.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.example.projectfigma.Entites
-
-import androidx.room.Entity
-import androidx.room.PrimaryKey
-
-@Entity(tableName = "best_seller")
-data class BestSeller(
- @PrimaryKey(autoGenerate = true) val id: Long = 0,
- val imageUri: String,
- val price: Double
-)
\ No newline at end of file
diff --git a/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt b/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt
new file mode 100644
index 0000000..c4edbb5
--- /dev/null
+++ b/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt
@@ -0,0 +1,18 @@
+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(
+ @PrimaryKey(autoGenerate = true) val id: Long = 0,
+ val imageUri: String,
+ val price: Double,
+ val rating: Double,
+ val isRecommend: 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/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 653a024..56d489c 100644
--- a/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt
+++ b/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt
@@ -65,8 +65,8 @@ class BannerFood : Fragment() {
}, 4000)
// 5) А обновление списка (LiveData) можно тоже повесить здесь:
- val dao = DataBase.getDb(requireContext()).getBestSellerDao()
- dao.getAllV().observe(viewLifecycleOwner) { list ->
+ val dao = DataBase.getDb(requireContext()).getDishesDao()
+ dao.getBestSellers().observe(viewLifecycleOwner) { list ->
promoAdapter.updateList(list)
}
}
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..8219490 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
@@ -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..92d458d
--- /dev/null
+++ b/app/src/main/java/com/example/projectfigma/Fragments/FavoriteListFragment.kt
@@ -0,0 +1,58 @@
+ package com.example.projectfigma.Fragments
+
+ import android.os.Bundle
+ import androidx.fragment.app.Fragment
+ import android.view.LayoutInflater
+ import android.view.View
+ import android.view.ViewGroup
+ 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.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
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentFavoriteListBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ adapter = FavoriteFoodAdapter(mutableListOf())
+ binding.rvFoods.layoutManager = GridLayoutManager(requireContext(), 2)
+ binding.rvFoods.adapter = adapter
+
+ lifecycleScope.launch {
+ val dishesList = withContext(Dispatchers.IO) {
+ DataBase.getDb(requireContext())
+ .getDishesDao()
+ .getAll()
+ }
+ adapter.updateList(dishesList)
+ }
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+ }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/projectfigma/Fragments/Recommend.kt b/app/src/main/java/com/example/projectfigma/Fragments/Recommend.kt
new file mode 100644
index 0000000..efe1762
--- /dev/null
+++ b/app/src/main/java/com/example/projectfigma/Fragments/Recommend.kt
@@ -0,0 +1,45 @@
+package com.example.projectfigma.Fragments
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.lifecycleScope
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.example.projectfigma.Adapters.RecommendAdapter
+import com.example.projectfigma.DataBase.DataBase
+import com.example.projectfigma.R
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+class Recommend : Fragment(R.layout.fragment_recommend) {
+ private val db by lazy { DataBase.getDb(requireContext()) }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ val rv = view.findViewById(R.id.rvRecommend)
+ rv.layoutManager = GridLayoutManager(requireContext(), 2)
+
+ viewLifecycleOwner.lifecycleScope.launch {
+ // 1. Получаем пользователя в IO
+ val sessionEmail = db.getSessionDao().getSession()?.userEmail.orEmpty()
+ val user = withContext(Dispatchers.IO) {
+ db.getUserDao().getUserByEmail(sessionEmail)
+ }
+
+ // 2. Теперь наблюдаем LiveData рекомендаций
+ // и каждый раз создаём новый адаптер с реальным списком
+ withContext(Dispatchers.Main) {
+ db.getDishesDao()
+ .getRecommend()
+ .observe(viewLifecycleOwner) { list ->
+ val adapter = RecommendAdapter(list)
+ rv.adapter = adapter
+ }
+ }
+ }
+ }
+}
\ 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
new file mode 100644
index 0000000..3dea9c6
--- /dev/null
+++ b/app/src/main/res/drawable/bg_rating.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/burger.png b/app/src/main/res/drawable/burger.png
new file mode 100644
index 0000000..9bc9451
Binary files /dev/null and b/app/src/main/res/drawable/burger.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_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_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_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_star_solid.png b/app/src/main/res/drawable/ic_star_solid.png
new file mode 100644
index 0000000..2b48c6e
Binary files /dev/null and b/app/src/main/res/drawable/ic_star_solid.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/drawable/roll.png b/app/src/main/res/drawable/roll.png
new file mode 100644
index 0000000..6a37b74
Binary files /dev/null and b/app/src/main/res/drawable/roll.png differ
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..f36a95c
--- /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_home.xml b/app/src/main/res/layout/activity_home.xml
index b120456..ecd2834 100644
--- a/app/src/main/res/layout/activity_home.xml
+++ b/app/src/main/res/layout/activity_home.xml
@@ -102,7 +102,6 @@
android:id="@+id/food_category_frame"
android:layout_width="wrap_content"
android:layout_height="77dp"
- android:paddingTop="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
@@ -153,6 +152,7 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_favorite_list.xml b/app/src/main/res/layout/fragment_favorite_list.xml
new file mode 100644
index 0000000..9a2dd1d
--- /dev/null
+++ b/app/src/main/res/layout/fragment_favorite_list.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_recommend.xml b/app/src/main/res/layout/fragment_recommend.xml
new file mode 100644
index 0000000..404cfbf
--- /dev/null
+++ b/app/src/main/res/layout/fragment_recommend.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_favorite_food.xml b/app/src/main/res/layout/item_favorite_food.xml
new file mode 100644
index 0000000..2845c4c
--- /dev/null
+++ b/app/src/main/res/layout/item_favorite_food.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_food.xml b/app/src/main/res/layout/item_food.xml
new file mode 100644
index 0000000..1053fe7
--- /dev/null
+++ b/app/src/main/res/layout/item_food.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build.gradle.kts b/build.gradle.kts
index a7b2ae0..5d68f11 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.10.0" apply false
- id("com.android.library") version "8.10.0" apply false
+ id("com.android.application") version "8.9.2" apply false
+ id("com.android.library") version "8.9.2" apply false
id("org.jetbrains.kotlin.android") version "2.1.20" apply false
}
\ No newline at end of file