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