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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+