diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 91853b6..21098fe 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -2,6 +2,7 @@ plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("kotlin-kapt") + id("kotlin-parcelize") } android { @@ -47,6 +48,9 @@ dependencies { androidTestImplementation("androidx.test.ext:junit:1.2.1") androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") + // JSON + implementation ("com.google.code.gson:gson:2.10.1") + // RecyclerView implementation("androidx.recyclerview:recyclerview:1.2.1") // CardView для скруглённых углов карточек diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 278200b..5f46ad7 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"> + @@ -31,6 +34,9 @@ + + + ("dish") + + if(likes.isLike(dish)){ + likes.setLikeButton(binding.likeButton, dish) + } + + binding.likeButton.setOnClickListener(){ + if (dish != null) { + likes.likeDish(dish,binding.likeButton) + } + } + + dish?.let { + binding.nameDishHeader.text = it.name + binding.tvRating.text = it.rating.toString() + binding.textPrice.text = "$" + it.price.toString() + Glide.with(binding.imgFood) + .load(dish.imageUri) + .into(binding.imgFood) + + binding.dishDescription.text = it.description + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/projectfigma/Activity/HelpActivity.kt b/app/src/main/java/com/example/projectfigma/Activity/HelpActivity.kt new file mode 100644 index 0000000..28b41b7 --- /dev/null +++ b/app/src/main/java/com/example/projectfigma/Activity/HelpActivity.kt @@ -0,0 +1,37 @@ +package com.example.projectfigma.Activity + +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.widget.LinearLayout +import androidx.appcompat.app.AppCompatActivity +import com.example.projectfigma.Fragments.BottomPanelFragment +import com.example.projectfigma.R +import com.example.projectfigma.Util.StatusBar + +class HelpActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activiti_help) + + val helpWithOrder = findViewById(R.id.help_with_order) + val helpCenter = findViewById(R.id.help_center) + + helpWithOrder.setOnClickListener { + val intent = Intent(this, OrderHelpActivity::class.java) + startActivity(intent) + } + + helpCenter.setOnClickListener { + val intent = Intent(this, HelpCenterActivity::class.java) + startActivity(intent) + } + + StatusBar.hideStatusBar(window) + + supportFragmentManager.beginTransaction() + .replace(R.id.buttonPanel, BottomPanelFragment()) + .commit() + } +} diff --git a/app/src/main/java/com/example/projectfigma/Activity/HelpCenterActivity.kt b/app/src/main/java/com/example/projectfigma/Activity/HelpCenterActivity.kt new file mode 100644 index 0000000..508a9bc --- /dev/null +++ b/app/src/main/java/com/example/projectfigma/Activity/HelpCenterActivity.kt @@ -0,0 +1,20 @@ +package com.example.projectfigma.Activity + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.example.projectfigma.Fragments.BottomPanelFragment +import com.example.projectfigma.R +import com.example.projectfigma.Util.StatusBar + +class HelpCenterActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_help_center) + + StatusBar.hideStatusBar(window) + + supportFragmentManager.beginTransaction() + .replace(R.id.buttonPanel, BottomPanelFragment()) + .commit() + } +} 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 a8d4cdb..95327fa 100644 --- a/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt +++ b/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt @@ -1,5 +1,6 @@ package com.example.projectfigma.Activity +import android.content.Intent import android.os.Bundle import android.widget.TextView import android.widget.Toast @@ -10,6 +11,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.projectfigma.Adapters.BestSellerAdapter import com.example.projectfigma.DAO.DishesDao +import com.example.projectfigma.DAO.SessionDao import com.example.projectfigma.DAO.UserDao import com.example.projectfigma.DataBase.DataBase import com.example.projectfigma.Entites.Dishes @@ -17,6 +19,7 @@ import com.example.projectfigma.Entites.User import com.example.projectfigma.Fragments.* import com.example.projectfigma.R import com.example.projectfigma.Util.StatusBar +import com.example.projectfigma.Util.SwitchCard class HomeActivity : AppCompatActivity(), HeaderButtonsFragment.Listener { @@ -24,44 +27,39 @@ class HomeActivity : AppCompatActivity(), private lateinit var adapter: BestSellerAdapter private lateinit var dao: DishesDao private lateinit var userDao: UserDao + private lateinit var sessionDao: SessionDao private lateinit var drawer: DrawerLayout - - private var user: User? = null + private lateinit var user: User override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_home) StatusBar.hideStatusBar(window) - drawer = findViewById(R.id.drawer_layout) - val db = DataBase.getDb(this) dao = db.getDishesDao() userDao = db.getUserDao() + sessionDao = db.getSessionDao() + user = (sessionDao.getSession()?.user ?: null)!! - val email = intent.getStringExtra("user_email") - if (!email.isNullOrBlank()) { - user = userDao.getUserByEmail(email) - } + drawer = findViewById(R.id.drawer_layout) + adapter = BestSellerAdapter(emptyList()) { item -> + SwitchCard.switchDish( + item, + this, + FoodDetailActivity::class.java + ) + } val rv = findViewById(R.id.rvBestSellers).apply { layoutManager = LinearLayoutManager( this@HomeActivity, LinearLayoutManager.HORIZONTAL, false ) - adapter = BestSellerAdapter(emptyList()) { item: Dishes -> - Toast.makeText( - this@HomeActivity, - "Clicked: ${item.price}", - Toast.LENGTH_SHORT - ).show() - }.also { this@HomeActivity.adapter = it } + adapter = this@HomeActivity.adapter } - - - dao.getBestSellersWithLimit(4).observe(this) { list -> adapter.updateList(list) } diff --git a/app/src/main/java/com/example/projectfigma/Activity/LogActivity.kt b/app/src/main/java/com/example/projectfigma/Activity/LogActivity.kt index efc8de9..6c6efb7 100644 --- a/app/src/main/java/com/example/projectfigma/Activity/LogActivity.kt +++ b/app/src/main/java/com/example/projectfigma/Activity/LogActivity.kt @@ -31,10 +31,6 @@ class LogActivity : AppCompatActivity() { val userDao = db.getUserDao() val sessionDao = db.getSessionDao() - supportFragmentManager.beginTransaction() - .replace(R.id.buttonPanel, BottomPanelFragment()) - .commit() - Password.setIsVisable(binding.passwordEditText) binding.goToSignUp.setOnClickListener { @@ -95,7 +91,7 @@ class LogActivity : AppCompatActivity() { } else -> { withContext(Dispatchers.IO) { - sessionDao.upsert(Session(id = 0, isLoggedIn = true, userEmail = email)) + sessionDao.upsert(Session(id = 0, isLoggedIn = true, userEmail = email, user = user)) } Toast.makeText(this@LogActivity, "Вход успешен", Toast.LENGTH_SHORT).show() startActivity( diff --git a/app/src/main/java/com/example/projectfigma/Activity/OrderHelpActivity.kt b/app/src/main/java/com/example/projectfigma/Activity/OrderHelpActivity.kt new file mode 100644 index 0000000..b050214 --- /dev/null +++ b/app/src/main/java/com/example/projectfigma/Activity/OrderHelpActivity.kt @@ -0,0 +1,21 @@ +package com.example.projectfigma.Activity + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.example.projectfigma.Fragments.BottomPanelFragment +import com.example.projectfigma.R +import com.example.projectfigma.Util.StatusBar + +class OrderHelpActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_order_help) + + StatusBar.hideStatusBar(window) + + supportFragmentManager.beginTransaction() + .replace(R.id.buttonPanel, BottomPanelFragment()) + .commit() + + } +} diff --git a/app/src/main/java/com/example/projectfigma/Activity/RegActivity.kt b/app/src/main/java/com/example/projectfigma/Activity/RegActivity.kt index e97fa84..7b1721d 100644 --- a/app/src/main/java/com/example/projectfigma/Activity/RegActivity.kt +++ b/app/src/main/java/com/example/projectfigma/Activity/RegActivity.kt @@ -36,10 +36,6 @@ class RegActivity() : AppCompatActivity(){ setupDatePicker() Reg(binding, dateBase) - supportFragmentManager.beginTransaction() - .replace(R.id.buttonPanel, BottomPanelFragment()) - .commit() - passwordEditText = binding.passwordEditText Password.setIsVisable(passwordEditText) 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 0a02bb3..87a33be 100644 --- a/app/src/main/java/com/example/projectfigma/Adapters/BestSellerAdapter.kt +++ b/app/src/main/java/com/example/projectfigma/Adapters/BestSellerAdapter.kt @@ -12,7 +12,7 @@ import com.example.projectfigma.R class BestSellerAdapter( private var items: List, - private val onClick: (Dishes) -> Unit + private val switchToSelfPage: (Dishes) -> Unit ) : RecyclerView.Adapter() { inner class VH(view: View) : RecyclerView.ViewHolder(view) { @@ -26,7 +26,7 @@ class BestSellerAdapter( .centerCrop() .into(ivFood) - itemView.setOnClickListener { onClick(item) } + itemView.setOnClickListener { switchToSelfPage(item) } } } diff --git a/app/src/main/java/com/example/projectfigma/Adapters/FavoriteDishesAdapter.kt b/app/src/main/java/com/example/projectfigma/Adapters/FavoriteDishesAdapter.kt index e06498b..4d8a8ba 100644 --- a/app/src/main/java/com/example/projectfigma/Adapters/FavoriteDishesAdapter.kt +++ b/app/src/main/java/com/example/projectfigma/Adapters/FavoriteDishesAdapter.kt @@ -15,7 +15,8 @@ import kotlin.coroutines.coroutineContext class FavoriteFoodAdapter( private val items: MutableList, - private val onFavoriteClick: (dish: Dishes) -> Unit + private val onFavoriteClick: (dish: Dishes) -> Unit, + private val switchToSelfPage: (Dishes) -> Unit ) : RecyclerView.Adapter() { inner class VH(view: View) : RecyclerView.ViewHolder(view) { @@ -46,6 +47,8 @@ class FavoriteFoodAdapter( holder.imgFavorite.setImageResource(R.drawable.ic_heart_border) holder.imgFavorite.setOnClickListener { onFavoriteClick(dish) } + + holder.itemView.setOnClickListener { switchToSelfPage(dish) } } override fun getItemCount(): Int = items.size diff --git a/app/src/main/java/com/example/projectfigma/Adapters/MainBestSellerAdapter.kt b/app/src/main/java/com/example/projectfigma/Adapters/MainBestSellerAdapter.kt index 379d2da..855b4a0 100644 --- a/app/src/main/java/com/example/projectfigma/Adapters/MainBestSellerAdapter.kt +++ b/app/src/main/java/com/example/projectfigma/Adapters/MainBestSellerAdapter.kt @@ -11,7 +11,10 @@ import com.bumptech.glide.Glide import com.example.projectfigma.Entites.Dishes import com.example.projectfigma.R -class MainBestSellerAdapter (private var dishes: List) : +class MainBestSellerAdapter ( + private var dishes: List, + private val switchToSelfPage: (Dishes) -> Unit +) : RecyclerView.Adapter() { inner class DishViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { @@ -31,7 +34,6 @@ class MainBestSellerAdapter (private var dishes: List) : override fun onBindViewHolder(holder: DishViewHolder, position: Int) { val dish = dishes[position] - // Используем Glide для загрузки изображения Glide.with(holder.itemView.context) .load(Uri.parse(dish.imageUri)) .into(holder.image) @@ -41,6 +43,8 @@ class MainBestSellerAdapter (private var dishes: List) : holder.description.text = dish.description holder.price.text = "$${dish.price}" holder.rating.text = "${dish.rating}" + + holder.itemView.setOnClickListener { switchToSelfPage(dish) } } override fun getItemCount(): Int = dishes.size diff --git a/app/src/main/java/com/example/projectfigma/Adapters/MainRecommendAdapter.kt b/app/src/main/java/com/example/projectfigma/Adapters/MainRecommendAdapter.kt index 1510d8f..b0584b5 100644 --- a/app/src/main/java/com/example/projectfigma/Adapters/MainRecommendAdapter.kt +++ b/app/src/main/java/com/example/projectfigma/Adapters/MainRecommendAdapter.kt @@ -12,7 +12,8 @@ import com.example.projectfigma.Entites.Dishes import com.example.projectfigma.R class MainRecommendAdapter( - private var dishes: List + private var dishes: List, + private val switchToSelfPage: (Dishes) -> Unit ) : RecyclerView.Adapter() { inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { @@ -41,6 +42,8 @@ class MainRecommendAdapter( holder.tvDesc.text = dish.description holder.tvPrice.text = "$" + dish.price.toString() holder.tvRating.text = dish.rating.toString() + + holder.itemView.setOnClickListener { switchToSelfPage(dish) } } override fun getItemCount(): Int = dishes.size 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 92a04c4..ecd3dbc 100644 --- a/app/src/main/java/com/example/projectfigma/Adapters/PromoAdapter.kt +++ b/app/src/main/java/com/example/projectfigma/Adapters/PromoAdapter.kt @@ -12,7 +12,8 @@ import com.example.projectfigma.R class PromoAdapter( private var items: List, - private val onBannerClick: () -> Unit) : + private val onBannerClick: () -> Unit +) : RecyclerView.Adapter() { inner class VH(view: View) : RecyclerView.ViewHolder(view) { diff --git a/app/src/main/java/com/example/projectfigma/Adapters/RecommendAdapter.kt b/app/src/main/java/com/example/projectfigma/Adapters/RecommendAdapter.kt index 85f6cb6..ab4235c 100644 --- a/app/src/main/java/com/example/projectfigma/Adapters/RecommendAdapter.kt +++ b/app/src/main/java/com/example/projectfigma/Adapters/RecommendAdapter.kt @@ -11,7 +11,8 @@ import com.example.projectfigma.Entites.Dishes import com.example.projectfigma.R class RecommendAdapter ( - private val items: List + private val items: List, + private val switchToSelfPage: (Dishes) -> Unit ) : RecyclerView.Adapter() { inner class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { @@ -23,6 +24,7 @@ class RecommendAdapter ( Glide.with(itemView).load(food.imageUri).into(ivFood) tvRating.text = String.format("%.1f", food.rating) tvPrice.text = "$${String.format("%.2f", food.price)}" + itemView.setOnClickListener { switchToSelfPage(food) } } } diff --git a/app/src/main/java/com/example/projectfigma/Converters/SessionConverters.kt b/app/src/main/java/com/example/projectfigma/Converters/SessionConverters.kt new file mode 100644 index 0000000..f68e423 --- /dev/null +++ b/app/src/main/java/com/example/projectfigma/Converters/SessionConverters.kt @@ -0,0 +1,22 @@ +package com.example.projectfigma.Converters + +import androidx.room.TypeConverter +import com.example.projectfigma.Entites.User +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class SessionConverters { + + private val gson = Gson() + + @TypeConverter + fun userToJson(user: User?): String? = + user?.let { gson.toJson(it) } + + @TypeConverter + fun jsonToUser(data: String?): User? = + data?.let { + val type = object : TypeToken() {}.type + gson.fromJson(it, type) + } +} \ 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 index ee99af3..1c761df 100644 --- a/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt +++ b/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt @@ -40,4 +40,25 @@ interface DishesDao { @Update suspend fun update(item: Dishes) + + //Сортировка по популярности (например, по рейтингу) + @Query("SELECT * FROM dishes ORDER BY rating DESC") + fun getSortedByRating(): LiveData> + + //Сортировка по цене (возрастание) + @Query("SELECT * FROM dishes ORDER BY price ASC") + fun getSortedByPriceAsc(): LiveData> + + //Сортировка по цене (убывание) + @Query("SELECT * FROM dishes ORDER BY price DESC") + fun getSortedByPriceDesc(): LiveData> + + @Query("SELECT * FROM Dishes ORDER BY rating DESC") + suspend fun getAllSortedByRating(): List + + @Query("SELECT * FROM Dishes ORDER BY price ASC") + suspend fun getAllSortedByPrice(): List + + @Query("SELECT * FROM Dishes ORDER BY ordersCount DESC") + suspend fun getAllSortedByPopularity(): List } \ 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 0badd54..e6be925 100644 --- a/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt +++ b/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt @@ -28,4 +28,14 @@ interface UserDao { @Query("SELECT * FROM USERS u WHERE u.gmail LIKE :email") fun getUserByEmail(email : String) : User + + @Query(""" + UPDATE users + SET favoriteDishesId = :favoriteDishes + WHERE id = :userId + """) + fun updateFavoriteDishes( + userId: Int, + favoriteDishes: List + ) } \ No newline at end of file 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 c0fffc1..e656f4f 100644 --- a/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt +++ b/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt @@ -20,8 +20,7 @@ import com.example.projectfigma.Entites.User import com.example.projectfigma.Enums.DishCategory import com.example.projectfigma.R import com.example.projectfigma.Converters.ConvertersToDateTime -import com.example.projectfigma.DAO.BasketDAO -import com.example.projectfigma.Entites.Basket +import com.example.projectfigma.Converters.SessionConverters import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -29,13 +28,14 @@ import kotlinx.coroutines.launch import java.util.Date @Database( - entities = [User::class, Dishes::class, Session::class, AppSettings::class, Basket::class], - version = 7 + entities = [User::class, Dishes::class, Session::class, AppSettings::class], + version = 10 ) @TypeConverters( ConvertersToDateTime::class, ConvertToDishesCategory::class, - ConvertersList::class + ConvertersList::class, + SessionConverters::class ) abstract class DataBase : RoomDatabase() { @@ -226,7 +226,7 @@ abstract class DataBase : RoomDatabase() { settingsDao.upsert(AppSettings(id = 0, isFirstRun = true)) val sessionDao = database.getSessionDao() - sessionDao.upsert(Session(id = 0, isLoggedIn = false, userEmail = null)) + sessionDao.upsert(Session(id = 0, isLoggedIn = false, userEmail = null, user = null)) } } }) diff --git a/app/src/main/java/com/example/projectfigma/Entites/Basket.kt b/app/src/main/java/com/example/projectfigma/Entites/Basket.kt index 89abec3..bfce10f 100644 --- a/app/src/main/java/com/example/projectfigma/Entites/Basket.kt +++ b/app/src/main/java/com/example/projectfigma/Entites/Basket.kt @@ -4,8 +4,7 @@ import androidx.room.Entity import androidx.room.PrimaryKey @Entity(tableName = "baskets") -data class Basket( +data class Basket ( @PrimaryKey(autoGenerate = true) val id: Long = 0, - val dishesId: List, - val userId: Int + val dishesIds: List ) 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 cee6616..986fdda 100644 --- a/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt +++ b/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt @@ -1,18 +1,22 @@ package com.example.projectfigma.Entites +import android.os.Parcelable import androidx.room.Entity import androidx.room.PrimaryKey import com.example.projectfigma.Enums.DishCategory +import kotlinx.android.parcel.Parcelize +@Parcelize @Entity(tableName = "dishes") data class Dishes( - @PrimaryKey(autoGenerate = true) val id: Long = 0, + @PrimaryKey(autoGenerate = true) val id: Int = 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 + val name : String, + val description : String, + val category: DishCategory, + val ordersCount: Int = 0 +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/example/projectfigma/Entites/Session.kt b/app/src/main/java/com/example/projectfigma/Entites/Session.kt index 5c6b57e..63d0807 100644 --- a/app/src/main/java/com/example/projectfigma/Entites/Session.kt +++ b/app/src/main/java/com/example/projectfigma/Entites/Session.kt @@ -7,5 +7,6 @@ import androidx.room.PrimaryKey data class Session( @PrimaryKey val id: Int = 0, // единственная запись val isLoggedIn: Boolean, - val userEmail: String? // email или null + val userEmail: String?, // email или null + val user: User? ) 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 54f85e8..5a79906 100644 --- a/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt +++ b/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt @@ -11,10 +11,12 @@ import android.view.ViewGroup import androidx.lifecycle.lifecycleScope import androidx.viewpager2.widget.ViewPager2 import com.example.projectfigma.Activity.AdverstsingPageActivity +import com.example.projectfigma.Activity.FoodDetailActivity import com.example.projectfigma.Activity.LogActivity import com.example.projectfigma.Adapters.PromoAdapter import com.example.projectfigma.DataBase.DataBase import com.example.projectfigma.R +import com.example.projectfigma.Util.SwitchCard import com.example.projectfigma.databinding.FragmentBannerFoodBinding import com.example.projectfigma.databinding.FragmentBestSellerBinding import com.google.android.material.tabs.TabLayout @@ -42,20 +44,19 @@ class BannerFood : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - // 1) Инициализируем адаптер - promoAdapter = PromoAdapter(emptyList()) { - val intent = Intent(requireContext(), AdverstsingPageActivity::class.java) - startActivity(intent) - requireActivity().finish() - } + promoAdapter = PromoAdapter(emptyList(), + onBannerClick = { + 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(com.example.projectfigma.R.drawable.tab_indicator_unselected) }.attach() - // 3) Слушаем смену вкладки для изменения иконки binding.tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { tab.setIcon(com.example.projectfigma.R.drawable.tab_indicator_selected) @@ -68,7 +69,6 @@ class BannerFood : Fragment() { override fun onTabReselected(tab: TabLayout.Tab) {} }) - // 4) Автопрокрутка с помощью корутины viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Main) { while (isActive) { delay(4000) @@ -79,7 +79,6 @@ class BannerFood : Fragment() { } } - // 5) Обновление списка из БД 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 48a43a5..aa3e1c8 100644 --- a/app/src/main/java/com/example/projectfigma/Fragments/BottomPanelActivity.kt +++ b/app/src/main/java/com/example/projectfigma/Fragments/BottomPanelActivity.kt @@ -7,6 +7,8 @@ import android.view.ViewGroup import android.widget.ImageView import androidx.fragment.app.Fragment import com.example.projectfigma.Activity.FavoritesActivity +import com.example.projectfigma.Activity.HelpActivity +import com.example.projectfigma.Activity.FoodDetailActivity import com.example.projectfigma.Activity.HomeActivity import com.example.projectfigma.R @@ -28,11 +30,11 @@ class BottomPanelFragment : Fragment() { val navSupport = view.findViewById(R.id.nav_support) navHome .setOnClickListener { openActivity(HomeActivity::class.java) } + navSupport .setOnClickListener { openActivity(HelpActivity::class.java) } navFav .setOnClickListener { openActivity(FavoritesActivity::class.java) } + navFood .setOnClickListener { openActivity(FoodDetailActivity::class.java) } /** - navFood .setOnClickListener { openActivity(FoodActivity::class.java) } navList .setOnClickListener { openActivity(OrdersActivity::class.java) } - navSupport .setOnClickListener { openActivity(SupportActivity::class.java) } **/ } diff --git a/app/src/main/java/com/example/projectfigma/Fragments/FavoriteListFragment.kt b/app/src/main/java/com/example/projectfigma/Fragments/FavoriteListFragment.kt index 8f55b5b..1fcb940 100644 --- a/app/src/main/java/com/example/projectfigma/Fragments/FavoriteListFragment.kt +++ b/app/src/main/java/com/example/projectfigma/Fragments/FavoriteListFragment.kt @@ -11,11 +11,13 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView + import com.example.projectfigma.Activity.FoodDetailActivity 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.Util.SwitchCard import com.example.projectfigma.databinding.FragmentBestSellerBinding import com.example.projectfigma.databinding.FragmentFavoriteListBinding import kotlinx.coroutines.Dispatchers @@ -47,7 +49,6 @@ override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - // 1) Загрузить текущего пользователя из БД lifecycleScope.launch(Dispatchers.IO) { currentUser = dataBase .getUserDao().getUserByEmail( @@ -60,21 +61,26 @@ } } private fun setupRecycler() { - adapter = FavoriteFoodAdapter(mutableListOf()) { dish -> + adapter = FavoriteFoodAdapter(mutableListOf(), + onFavoriteClick = { 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) } - } - } - } + } + }}, + switchToSelfPage = { item -> + SwitchCard.switchDish( + item, + requireContext(), + FoodDetailActivity::class.java + ) + }) binding.rvFoods.layoutManager = GridLayoutManager(requireContext(), 2) binding.rvFoods.adapter = adapter } diff --git a/app/src/main/java/com/example/projectfigma/Fragments/MainBestSeller.kt b/app/src/main/java/com/example/projectfigma/Fragments/MainBestSeller.kt index 132688b..c2899f4 100644 --- a/app/src/main/java/com/example/projectfigma/Fragments/MainBestSeller.kt +++ b/app/src/main/java/com/example/projectfigma/Fragments/MainBestSeller.kt @@ -7,11 +7,13 @@ import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.example.projectfigma.Activity.FoodDetailActivity import com.example.projectfigma.Adapters.MainBestSellerAdapter import com.example.projectfigma.DAO.DishesDao import com.example.projectfigma.DataBase.DataBase import com.example.projectfigma.Entites.Dishes import com.example.projectfigma.R +import com.example.projectfigma.Util.SwitchCard class MainBestSeller : Fragment(R.layout.fragment_main_best_seller) { @@ -34,7 +36,15 @@ class MainBestSeller : Fragment(R.layout.fragment_main_best_seller) { dishesDao = database.getDishesDao() dishesDao.getBestSellers().observe(viewLifecycleOwner) { dishList -> - adapter = MainBestSellerAdapter(dishList) + adapter = MainBestSellerAdapter(dishList, + switchToSelfPage = { item -> + SwitchCard.switchDish( + item, + requireContext(), + FoodDetailActivity::class.java + ) + } + ) recyclerView.adapter = adapter } } diff --git a/app/src/main/java/com/example/projectfigma/Fragments/NotificationFragment.kt b/app/src/main/java/com/example/projectfigma/Fragments/NotificationFragment.kt index 2cd7092..dc60639 100644 --- a/app/src/main/java/com/example/projectfigma/Fragments/NotificationFragment.kt +++ b/app/src/main/java/com/example/projectfigma/Fragments/NotificationFragment.kt @@ -8,6 +8,5 @@ import com.example.projectfigma.R class NotificationFragment : Fragment(R.layout.fragment_notifications) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - // TODO: здесь можно динамически заполнить список уведомлений через RecyclerView или просто оставить статично } } diff --git a/app/src/main/java/com/example/projectfigma/Fragments/RecomandationFragment.kt b/app/src/main/java/com/example/projectfigma/Fragments/RecomandationFragment.kt index 23ad5c4..213b8e8 100644 --- a/app/src/main/java/com/example/projectfigma/Fragments/RecomandationFragment.kt +++ b/app/src/main/java/com/example/projectfigma/Fragments/RecomandationFragment.kt @@ -5,18 +5,28 @@ import androidx.fragment.app.Fragment import android.view.View import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.example.projectfigma.Activity.FoodDetailActivity import com.example.projectfigma.Adapters.MainBestSellerAdapter import com.example.projectfigma.Adapters.MainRecommendAdapter import com.example.projectfigma.DAO.DishesDao import com.example.projectfigma.DataBase.DataBase import com.example.projectfigma.R +import com.example.projectfigma.Util.SwitchCard + class RecomandationFragment : Fragment(R.layout.fragment_recomandation_fragemnt) { private lateinit var dataBase: DataBase private lateinit var dishesDao: DishesDao - // Создаём адаптер сразу с пустым списком - private val adapter by lazy { MainRecommendAdapter(emptyList()) } + private val adapter by lazy { MainRecommendAdapter(emptyList(), + switchToSelfPage = { item -> + SwitchCard.switchDish( + item, + requireContext(), + FoodDetailActivity::class.java + ) + } + ) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -29,9 +39,7 @@ class RecomandationFragment : Fragment(R.layout.fragment_recomandation_fragemnt) // Наблюдаем за списком рекомендаций dishesDao.getRecommend().observe(viewLifecycleOwner) { dishList -> - // Если MainRecommendAdapter у вас наследник ListAdapter: - // adapter.submitList(dishList) - // Иначе: + adapter.updateData(dishList) adapter.notifyDataSetChanged() } diff --git a/app/src/main/java/com/example/projectfigma/Fragments/Recommend.kt b/app/src/main/java/com/example/projectfigma/Fragments/Recommend.kt index f42fcc3..b73cbca 100644 --- a/app/src/main/java/com/example/projectfigma/Fragments/Recommend.kt +++ b/app/src/main/java/com/example/projectfigma/Fragments/Recommend.kt @@ -11,10 +11,12 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.projectfigma.Activity.BestSellerActivity +import com.example.projectfigma.Activity.FoodDetailActivity import com.example.projectfigma.Activity.RecomendationActivity import com.example.projectfigma.Adapters.RecommendAdapter import com.example.projectfigma.DataBase.DataBase import com.example.projectfigma.R +import com.example.projectfigma.Util.SwitchCard import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -45,7 +47,15 @@ class Recommend : Fragment(R.layout.fragment_recommend) { db.getDishesDao() .getRecommend() .observe(viewLifecycleOwner) { list -> - val adapter = RecommendAdapter(list) + val adapter = RecommendAdapter(list, + switchToSelfPage = { item -> + SwitchCard.switchDish( + item, + requireContext(), + FoodDetailActivity::class.java + ) + } + ) rv.adapter = adapter } } diff --git a/app/src/main/java/com/example/projectfigma/Util/Likes.kt b/app/src/main/java/com/example/projectfigma/Util/Likes.kt new file mode 100644 index 0000000..cac6f3c --- /dev/null +++ b/app/src/main/java/com/example/projectfigma/Util/Likes.kt @@ -0,0 +1,49 @@ +package com.example.projectfigma.Util + +import android.widget.ImageView +import androidx.viewbinding.ViewBinding +import com.example.projectfigma.DataBase.DataBase +import com.example.projectfigma.Entites.Dishes +import com.example.projectfigma.R + +class Likes { + + private var dataBase: DataBase + + constructor(dataBase: DataBase){ + this.dataBase = dataBase + } + + public fun likeDish(dish: Dishes, likeButton: ImageView) { + + val user = dataBase.getSessionDao().getSession() + ?.let { it.userEmail?.let { it1 -> dataBase.getUserDao().getUserByEmail(it1) } } + + val favoriteDishes:List = user?.favoriteDishesId ?: emptyList() + if (isLike(dish)) { + val updatedDishes: List = favoriteDishes.filter { it != dish.id } + dataBase.getUserDao().updateFavoriteDishes(user?.id!!, updatedDishes) + } else { + val updatedDishes = favoriteDishes + dish.id + dataBase.getUserDao().updateFavoriteDishes(user?.id!!, updatedDishes) + } + } + + + public fun isLike(dish: Dishes?): Boolean { + val user = dataBase.getSessionDao().getSession() + ?.let { it.userEmail?.let { it1 -> dataBase.getUserDao().getUserByEmail(it1) } } + + val favoriteDishes:List = user?.favoriteDishesId ?: emptyList() + return favoriteDishes.contains(dish?.id) + } + + public fun setLikeButton(likeButton: ImageView, dish: Dishes?) { + if (isLike(dish)) { + likeButton.setImageResource(R.drawable.ic_heart_border) + } else { + likeButton.setImageResource(R.drawable.ic_dislike) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/projectfigma/Util/SwitchCard.kt b/app/src/main/java/com/example/projectfigma/Util/SwitchCard.kt new file mode 100644 index 0000000..4ce9834 --- /dev/null +++ b/app/src/main/java/com/example/projectfigma/Util/SwitchCard.kt @@ -0,0 +1,21 @@ +package com.example.projectfigma.Util + +import android.content.Context +import android.content.Intent +import androidx.core.content.ContextCompat.startActivity +import androidx.viewbinding.ViewBinding +import com.example.projectfigma.Activity.FoodDetailActivity +import com.example.projectfigma.Entites.Dishes +import java.util.Objects + +class SwitchCard { + companion object { + @JvmStatic + fun switchDish(item: Dishes, context: Context, cls: Class<*>) { + val intent = Intent(context, cls).apply { + putExtra("dish", item) + } + context.startActivity(intent) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_circle_white.xml b/app/src/main/res/drawable/bg_circle_white.xml new file mode 100644 index 0000000..64f8b34 --- /dev/null +++ b/app/src/main/res/drawable/bg_circle_white.xml @@ -0,0 +1,3 @@ + + + diff --git a/app/src/main/res/drawable/bg_edittext_rounded.xml b/app/src/main/res/drawable/bg_edittext_rounded.xml new file mode 100644 index 0000000..a56fdd2 --- /dev/null +++ b/app/src/main/res/drawable/bg_edittext_rounded.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/drawable/bg_header_rounded.xml b/app/src/main/res/drawable/bg_header_rounded.xml new file mode 100644 index 0000000..3413fd7 --- /dev/null +++ b/app/src/main/res/drawable/bg_header_rounded.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/drawable/chat.PNG b/app/src/main/res/drawable/chat.PNG new file mode 100644 index 0000000..253cfa3 Binary files /dev/null and b/app/src/main/res/drawable/chat.PNG differ diff --git a/app/src/main/res/drawable/custom_radio_button.xml b/app/src/main/res/drawable/custom_radio_button.xml new file mode 100644 index 0000000..689af94 --- /dev/null +++ b/app/src/main/res/drawable/custom_radio_button.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_attachment.png b/app/src/main/res/drawable/ic_attachment.png new file mode 100644 index 0000000..23f849b Binary files /dev/null and b/app/src/main/res/drawable/ic_attachment.png differ diff --git a/app/src/main/res/drawable/ic_dislike.png b/app/src/main/res/drawable/ic_dislike.png new file mode 100644 index 0000000..d20a342 Binary files /dev/null and b/app/src/main/res/drawable/ic_dislike.png differ diff --git a/app/src/main/res/drawable/ic_mic.png b/app/src/main/res/drawable/ic_mic.png new file mode 100644 index 0000000..b4a2723 Binary files /dev/null and b/app/src/main/res/drawable/ic_mic.png differ diff --git a/app/src/main/res/drawable/ic_nachosi.png b/app/src/main/res/drawable/ic_nachosi.png new file mode 100644 index 0000000..8992fe8 Binary files /dev/null and b/app/src/main/res/drawable/ic_nachosi.png differ diff --git a/app/src/main/res/drawable/ic_send.png b/app/src/main/res/drawable/ic_send.png new file mode 100644 index 0000000..3d5fdfa Binary files /dev/null and b/app/src/main/res/drawable/ic_send.png differ diff --git a/app/src/main/res/drawable/radio_checked.xml b/app/src/main/res/drawable/radio_checked.xml new file mode 100644 index 0000000..f365734 --- /dev/null +++ b/app/src/main/res/drawable/radio_checked.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/radio_unchecked.xml b/app/src/main/res/drawable/radio_unchecked.xml new file mode 100644 index 0000000..500afdf --- /dev/null +++ b/app/src/main/res/drawable/radio_unchecked.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/res/layout/activiti_help.xml b/app/src/main/res/layout/activiti_help.xml new file mode 100644 index 0000000..b7abdca --- /dev/null +++ b/app/src/main/res/layout/activiti_help.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_advertising_page.xml b/app/src/main/res/layout/activity_advertising_page.xml index 01f1994..9fe3f0c 100644 --- a/app/src/main/res/layout/activity_advertising_page.xml +++ b/app/src/main/res/layout/activity_advertising_page.xml @@ -22,6 +22,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Jumbo (12 Slides)" + android:textColor="@color/black" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -39,6 +40,7 @@ + + app:layout_constraintTop_toBottomOf="@+id/dividingLine2" /> + + app:layout_constraintTop_toBottomOf="@+id/textView4" /> - @@ -362,6 +375,7 @@ android:id="@+id/tvPersonalPrice" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:textColor="@color/black" android:text="$0.00" app:layout_constraintStart_toEndOf="@id/tvPersonalSeparator" app:layout_constraintTop_toTopOf="@id/tvPersonalSeparator" @@ -382,6 +396,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_help_center.xml b/app/src/main/res/layout/activity_help_center.xml new file mode 100644 index 0000000..cd9ae5b --- /dev/null +++ b/app/src/main/res/layout/activity_help_center.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_order_help.xml b/app/src/main/res/layout/activity_order_help.xml new file mode 100644 index 0000000..09beadf --- /dev/null +++ b/app/src/main/res/layout/activity_order_help.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +