From 9d99fb7f532684a57bc773c74b16885fea298c33 Mon Sep 17 00:00:00 2001 From: Egorick Date: Mon, 19 May 2025 21:58:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=BB?= =?UTF-8?q?=D0=B0=D0=B9=D0=BA=D0=B8.=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=A1=D0=B5=D1=81=D1=81=D0=B8=D1=8E?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 3 ++ .../Activity/FoodDetailActivity.kt | 31 ++++++----- .../projectfigma/Activity/HomeActivity.kt | 12 ++--- .../projectfigma/Activity/LogActivity.kt | 6 +-- .../projectfigma/Activity/RegActivity.kt | 4 -- .../Converters/SessionConverters.kt | 22 ++++++++ .../com/example/projectfigma/DAO/UserDao.kt | 2 +- .../example/projectfigma/DataBase/DataBase.kt | 8 +-- .../example/projectfigma/Entites/Session.kt | 3 +- .../com/example/projectfigma/Util/Likes.kt | 49 ++++++++++++++++++ app/src/main/res/drawable/ic_dislike.png | Bin 0 -> 1470 bytes 11 files changed, 103 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/com/example/projectfigma/Converters/SessionConverters.kt create mode 100644 app/src/main/java/com/example/projectfigma/Util/Likes.kt create mode 100644 app/src/main/res/drawable/ic_dislike.png diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b3e2bea..21098fe 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -48,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/java/com/example/projectfigma/Activity/FoodDetailActivity.kt b/app/src/main/java/com/example/projectfigma/Activity/FoodDetailActivity.kt index 9c528d7..cb6e4b4 100644 --- a/app/src/main/java/com/example/projectfigma/Activity/FoodDetailActivity.kt +++ b/app/src/main/java/com/example/projectfigma/Activity/FoodDetailActivity.kt @@ -13,6 +13,7 @@ import com.example.projectfigma.DataBase.DataBase import com.example.projectfigma.Entites.Dishes import com.example.projectfigma.Fragments.BottomPanelFragment import com.example.projectfigma.R +import com.example.projectfigma.Util.Likes import com.example.projectfigma.Util.StatusBar import com.example.projectfigma.databinding.ActivityFavoritesBinding import com.example.projectfigma.databinding.ActivityFoodDetailBinding @@ -21,11 +22,13 @@ import kotlin.time.toDuration class FoodDetailActivity : AppCompatActivity() { private lateinit var binding: ActivityFoodDetailBinding private lateinit var dataBase : DataBase + private lateinit var likes: Likes override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) dataBase = DataBase.getDb(this) + likes = Likes(dataBase) binding = ActivityFoodDetailBinding.inflate(layoutInflater) setContentView(binding.root) @@ -39,7 +42,18 @@ class FoodDetailActivity : AppCompatActivity() { startActivity(Intent(this@FoodDetailActivity,HomeActivity::class.java)) } - val dish: Dishes? = intent.getParcelableExtra("dish") + val dish = intent.getParcelableExtra("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() @@ -51,19 +65,4 @@ class FoodDetailActivity : AppCompatActivity() { binding.dishDescription.text = it.description } } - - private suspend fun likeDish(dish: Dishes) { - - val user = dataBase.getSessionDao().getSession() - ?.let { it.userEmail?.let { it1 -> dataBase.getUserDao().getUserByEmail(it1) } } - - val favoriteDishes:List = user?.favoriteDishesId ?: emptyList() - if (favoriteDishes.contains(dish.id)) { - 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) - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt b/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt index cb93b7f..95327fa 100644 --- a/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt +++ b/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt @@ -11,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 @@ -26,9 +27,9 @@ 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) @@ -38,11 +39,8 @@ class HomeActivity : AppCompatActivity(), val db = DataBase.getDb(this) dao = db.getDishesDao() userDao = db.getUserDao() - - val email = intent.getStringExtra("user_email") - if (!email.isNullOrBlank()) { - user = userDao.getUserByEmail(email) - } + sessionDao = db.getSessionDao() + user = (sessionDao.getSession()?.user ?: null)!! drawer = findViewById(R.id.drawer_layout) 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/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/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/UserDao.kt b/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt index e973560..e6be925 100644 --- a/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt +++ b/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt @@ -34,7 +34,7 @@ interface UserDao { SET favoriteDishesId = :favoriteDishes WHERE id = :userId """) - suspend fun updateFavoriteDishes( + fun updateFavoriteDishes( userId: Int, favoriteDishes: List ) 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 92d1cf1..9d5b76d 100644 --- a/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt +++ b/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt @@ -20,6 +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.Converters.SessionConverters import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -28,12 +29,13 @@ import java.util.Date @Database( entities = [User::class, Dishes::class, Session::class, AppSettings::class], - version = 9 + version = 10 ) @TypeConverters( ConvertersToDateTime::class, ConvertToDishesCategory::class, - ConvertersList::class + ConvertersList::class, + SessionConverters::class ) abstract class DataBase : RoomDatabase() { @@ -223,7 +225,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/Session.kt b/app/src/main/java/com/example/projectfigma/Entites/Session.kt index 450e7f3..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/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/res/drawable/ic_dislike.png b/app/src/main/res/drawable/ic_dislike.png new file mode 100644 index 0000000000000000000000000000000000000000..d20a342334d62e72df48b346f15942c725610890 GIT binary patch literal 1470 zcmV;v1ws0WP)+bV|yRzr@idFc;@eC-tEoN(SVlc`CHf5*B=TYj^*cL z`MH!Niky+kIOm9?;vQ#Nb{Bc@d?#zDEGjK4zt|&^6%ZDp;%4w`PQoCX@|u)a-UIN| z$G9dh$EZv-&j+ZGp^~9UZf6Gu@I+6%KqkUQI4Rz zz)>P^^fQ#1*JBWq1v(aSHP^PJgL)(SI$4N^hJuZahrDjy4eqZdwY)H+1a%44q*Z^H z@Ip+0#Jh+S7LV{J;ta$i+>1CP@d&pfPHDhs3+n7-r$i5RD!f;J$)gQ`)&kUK(l_l4w)(%Z~mrlFgVqR00wj`}aWl`>~@WclsvSprfy>?6- zyswV5)(a1PUo*8{C<1ujo8N!SU;Xl3e);3K1^9dY=lM>&CXj~bgS>e>52ReT!m{$b zmPd9%cJU&AB`f*jlXvrfKYGW=%P;QaS7%Rm(sB^zzx(g+q}TJowRk$0Kr5~v1bo6H zx?uhMkD^jl1wX%&r{6!QJZJUjz6^h_3WqqGzyI3F2j5+M^>GysH)Hka%PJq_spo@h zn(}c0&Yih_Xui%@9T1Pa4#K=S-`~Wp&VH^0;FZVUbQ2Hs;bmyXJPrqGsCklzdOrKS(*&+*x*4w6YQ{dAFI8am&ApwlIzzY!}?P6gFdD&)a-2LcRJJu^6$F<&!g^uhxJ8{#vdGQ zHk%V3&LOF7P5CpkzW;9 zTV9_%t@6jUc(@OWrJU={ggShQID~kL6EEBOb?73x=-_dbIgohew!V)I)h0;9zK1^g zp;c({Ky|PrJdeaCQnkdg6>(_s1V&&o*$?6cXdb~kwkK!$5)FCq@DOaB4g1*EZ%bDZ zV-OD%+xcXwA9TL0)fRph%)<#?Jfz{_0oi>%Ce(b;1V0NliO9tpa+k;WXvdJv7;q7F zfpqa~4%l5|e7FcE25iQl6skN>CocoH!uC5Oc0_rgZZbSPXh;wgE@EWj<+U$q4?UO= zx`;7}C+fV9ECw$GBw|G3f#$cClouw3#KD1Z5sBCAePp3G7{)+t-)AxrV54;`;Ac{} zK8=#S#Cfj7n8xuo;VDA&-5p#npJ4S~}^`#Kwoz$3>g95-2s zyIFbe9AdDU#!tcTGwgONF