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