From 7d0ac24dd290cec57200a4def011b861176746f2 Mon Sep 17 00:00:00 2001 From: Egorick <112876399+Vooidss@users.noreply.github.com> Date: Fri, 9 May 2025 23:50:34 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=94=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB?= =?UTF-8?q?=20"=D0=98=D0=B7=D0=B1=D1=80=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Activity/FavoritesActivity.kt | 6 -- .../projectfigma/Activity/RegActivity.kt | 3 +- .../Adapters/FavoriteDishesAdapter.kt | 11 ++-- .../projectfigma/Converters/ConvertersList.kt | 11 ++++ .../com/example/projectfigma/DAO/DishesDao.kt | 7 +++ .../com/example/projectfigma/DAO/UserDao.kt | 7 ++- .../example/projectfigma/DataBase/DataBase.kt | 44 +++++++++++++-- .../example/projectfigma/Entites/Dishes.kt | 4 +- .../com/example/projectfigma/Entites/User.kt | 3 +- .../Fragments/BottomPanelActivity.kt | 2 +- .../Fragments/FavoriteListFragment.kt | 56 ++++++++++++++++--- .../main/res/layout/activity_favorites.xml | 2 +- .../res/layout/activity_forget_password.xml | 2 +- app/src/main/res/layout/activity_home.xml | 2 +- app/src/main/res/layout/activity_log.xml | 2 +- app/src/main/res/layout/activity_reg.xml | 2 +- ...om_panel.xml => fragment_bottom_panel.xml} | 0 17 files changed, 130 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/com/example/projectfigma/Converters/ConvertersList.kt rename app/src/main/res/layout/{activity_bottom_panel.xml => fragment_bottom_panel.xml} (100%) diff --git a/app/src/main/java/com/example/projectfigma/Activity/FavoritesActivity.kt b/app/src/main/java/com/example/projectfigma/Activity/FavoritesActivity.kt index d64e910..e08eaf0 100644 --- a/app/src/main/java/com/example/projectfigma/Activity/FavoritesActivity.kt +++ b/app/src/main/java/com/example/projectfigma/Activity/FavoritesActivity.kt @@ -20,12 +20,6 @@ class FavoritesActivity : AppCompatActivity() { setContentView(binding.root) StatusBar.hideStatusBar(window) - val dateBase = DataBase.getDb(this) - - val rv = findViewById(R.id.rvFoods).apply { - layoutManager = GridLayoutManager(context, 2) - } - 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 b58a444..e97fa84 100644 --- a/app/src/main/java/com/example/projectfigma/Activity/RegActivity.kt +++ b/app/src/main/java/com/example/projectfigma/Activity/RegActivity.kt @@ -85,7 +85,8 @@ class RegActivity() : AppCompatActivity(){ binding.passwordEditText.text.toString(), email, binding.mobileNumberEdit.text.toString(), - selectedDate ?: Date() + selectedDate ?: Date(), + favoriteDishesId = emptyList() ) Thread { 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 62b7beb..e06498b 100644 --- a/app/src/main/java/com/example/projectfigma/Adapters/FavoriteDishesAdapter.kt +++ b/app/src/main/java/com/example/projectfigma/Adapters/FavoriteDishesAdapter.kt @@ -7,11 +7,15 @@ import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide +import com.example.projectfigma.DataBase.DataBase import com.example.projectfigma.Entites.Dishes +import com.example.projectfigma.Entites.User import com.example.projectfigma.R +import kotlin.coroutines.coroutineContext class FavoriteFoodAdapter( - private val items: MutableList + private val items: MutableList, + private val onFavoriteClick: (dish: Dishes) -> Unit ) : RecyclerView.Adapter() { inner class VH(view: View) : RecyclerView.ViewHolder(view) { @@ -34,16 +38,14 @@ class FavoriteFoodAdapter( holder.tvTitle.text = dish.name holder.tvDesc.text = dish.description - // загрузка изображения блюда Glide.with(holder.itemView) .load(dish.imageUri) .into(holder.imgFood) - // иконка категории holder.imgTag.setImageResource(dish.category.iconRes) - // иконка «избранное»— всегда заполнена holder.imgFavorite.setImageResource(R.drawable.ic_heart_border) + holder.imgFavorite.setOnClickListener { onFavoriteClick(dish) } } override fun getItemCount(): Int = items.size @@ -54,4 +56,5 @@ class FavoriteFoodAdapter( items.addAll(newItems) notifyDataSetChanged() } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/projectfigma/Converters/ConvertersList.kt b/app/src/main/java/com/example/projectfigma/Converters/ConvertersList.kt new file mode 100644 index 0000000..37f8820 --- /dev/null +++ b/app/src/main/java/com/example/projectfigma/Converters/ConvertersList.kt @@ -0,0 +1,11 @@ +package com.example.projectfigma.Converters + +import androidx.room.TypeConverter + +class ConvertersList { + @TypeConverter + fun fromIntList(value: List?): String = value?.joinToString(",") ?: "" + @TypeConverter + fun toIntList(value: String): List = + if (value.isEmpty()) emptyList() else value.split(",").map { it.toInt() } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt b/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt index f59e898..ee99af3 100644 --- a/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt +++ b/app/src/main/java/com/example/projectfigma/DAO/DishesDao.kt @@ -7,6 +7,7 @@ import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Update import com.example.projectfigma.Entites.Dishes +import com.example.projectfigma.Enums.DishCategory @Dao interface DishesDao { @@ -31,6 +32,12 @@ interface DishesDao { @Query("SELECT * FROM dishes b WHERE b.isRecommend = 1") fun getRecommend(): LiveData> + @Query("SELECT * FROM dishes d WHERE d.id = :id") + fun getDishById(id : Int) : Dishes + + @Query("SELECT * FROM dishes WHERE id IN (:ids)") + fun getDishesByIds(ids: List): List + @Update suspend fun update(item: Dishes) } \ No newline at end of file diff --git a/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt b/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt index 24a9c92..0badd54 100644 --- a/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt +++ b/app/src/main/java/com/example/projectfigma/DAO/UserDao.kt @@ -2,16 +2,21 @@ package com.example.projectfigma.DAO import androidx.room.Dao import androidx.room.Insert +import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Update +import com.example.projectfigma.Entites.Dishes import com.example.projectfigma.Entites.User @Dao interface UserDao { - @Insert + @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertUser(item: User) + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertAll(items: List) + @Update fun updateUser(user: User) diff --git a/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt b/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt index 497b03d..cf15fbd 100644 --- a/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt +++ b/app/src/main/java/com/example/projectfigma/DataBase/DataBase.kt @@ -1,12 +1,14 @@ package com.example.projectfigma.DataBase import android.content.Context +import android.text.style.TtsSpan import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.TypeConverters import androidx.sqlite.db.SupportSQLiteDatabase import com.example.projectfigma.Converters.ConvertToDishesCategory +import com.example.projectfigma.Converters.ConvertersList import com.example.projectfigma.DAO.DishesDao import com.example.projectfigma.DAO.SettingsDao import com.example.projectfigma.DAO.SessionDao @@ -22,12 +24,17 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch +import java.util.Date @Database( entities = [User::class, Dishes::class, Session::class, AppSettings::class], - version = 5 + version = 6 +) +@TypeConverters( + ConvertersToDateTime::class, + ConvertToDishesCategory::class, + ConvertersList::class ) -@TypeConverters(ConvertersToDateTime::class, ConvertToDishesCategory::class) abstract class DataBase : RoomDatabase() { abstract fun getUserDao(): UserDao @@ -41,6 +48,17 @@ abstract class DataBase : RoomDatabase() { private val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + private fun prepopulateUsers(): List = listOf( + User( + name = "TestUser", + gmail = "test@yandex.ru", + password = "1111", + mobileNumber = "818412481", + dateOfBirth = Date(), + favoriteDishesId = listOf(1,2,3) + ) + ) + private fun prepopulateBestSellers(packageName: String) = listOf( Dishes( imageUri = "android.resource://$packageName/${R.drawable.best_seller_card_1}", @@ -92,6 +110,16 @@ abstract class DataBase : RoomDatabase() { description = "Бургер", category = DishCategory.MEAL ), + Dishes( + imageUri = "android.resource://$packageName/${R.drawable.roll}", + price = 25.0, + isBestSeller = false, + isRecommend = true, + rating = 5.0, + name = "Роллы", + description = "Роллы", + category = DishCategory.VEGAN + ), Dishes( imageUri = "android.resource://$packageName/${R.drawable.roll}", price = 25.0, @@ -121,10 +149,16 @@ abstract class DataBase : RoomDatabase() { applicationScope.launch { val database = getDb(appContext) - val bestSellerDao = database.getDishesDao() - if (bestSellerDao.getAll().isEmpty()) { - bestSellerDao.insertAll(prepopulateBestSellers(pkg)) + val dishesDao = database.getDishesDao() + if (dishesDao.getAll().isEmpty()) { + dishesDao.insertAll(prepopulateBestSellers(pkg)) + } + + val userDao = database.getUserDao() + if (userDao.getAllUsers().isEmpty()) { + userDao.insertAll(prepopulateUsers()) } + val settingsDao = database.getSettingsDao() settingsDao.upsert(AppSettings(id = 0, isFirstRun = true)) diff --git a/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt b/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt index c4edbb5..cee6616 100644 --- a/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt +++ b/app/src/main/java/com/example/projectfigma/Entites/Dishes.kt @@ -12,7 +12,7 @@ data class Dishes( val rating: Double, val isRecommend: Boolean, val isBestSeller: Boolean, - val name : String, - val description : String, + val name: String, + val description: String, val category: DishCategory ) \ No newline at end of file diff --git a/app/src/main/java/com/example/projectfigma/Entites/User.kt b/app/src/main/java/com/example/projectfigma/Entites/User.kt index 2d252a6..b21ced1 100644 --- a/app/src/main/java/com/example/projectfigma/Entites/User.kt +++ b/app/src/main/java/com/example/projectfigma/Entites/User.kt @@ -18,5 +18,6 @@ data class User( @ColumnInfo(name = "mobileNumber") var mobileNumber : String, @ColumnInfo(name = "dateOfBirth") - var dateOfBirth : Date + var dateOfBirth : Date, + var favoriteDishesId: List ) diff --git a/app/src/main/java/com/example/projectfigma/Fragments/BottomPanelActivity.kt b/app/src/main/java/com/example/projectfigma/Fragments/BottomPanelActivity.kt index 8219490..48a43a5 100644 --- a/app/src/main/java/com/example/projectfigma/Fragments/BottomPanelActivity.kt +++ b/app/src/main/java/com/example/projectfigma/Fragments/BottomPanelActivity.kt @@ -16,7 +16,7 @@ class BottomPanelFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? = inflater.inflate(R.layout.activity_bottom_panel, container, false) + ): View? = inflater.inflate(R.layout.fragment_bottom_panel, container, false) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) 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 92d458d..8f55b5b 100644 --- a/app/src/main/java/com/example/projectfigma/Fragments/FavoriteListFragment.kt +++ b/app/src/main/java/com/example/projectfigma/Fragments/FavoriteListFragment.kt @@ -1,16 +1,20 @@ package com.example.projectfigma.Fragments + import android.content.Context + import android.os.Build import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup + import androidx.annotation.RequiresApi import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.projectfigma.Adapters.FavoriteFoodAdapter import com.example.projectfigma.DataBase.DataBase import com.example.projectfigma.Entites.Dishes + import com.example.projectfigma.Entites.User import com.example.projectfigma.R import com.example.projectfigma.databinding.FragmentBestSellerBinding import com.example.projectfigma.databinding.FragmentFavoriteListBinding @@ -24,6 +28,8 @@ private val binding get() = _binding!! private lateinit var adapter: FavoriteFoodAdapter + private var currentUser: User? = null + private lateinit var dataBase: DataBase override fun onCreateView( inflater: LayoutInflater, @@ -34,23 +40,57 @@ return binding.root } + override fun onAttach(context: Context) { + super.onAttach(context) + dataBase = DataBase.getDb(context) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - - adapter = FavoriteFoodAdapter(mutableListOf()) + // 1) Загрузить текущего пользователя из БД + lifecycleScope.launch(Dispatchers.IO) { + currentUser = dataBase + .getUserDao().getUserByEmail( + dataBase.getSessionDao().getSession()?.userEmail.toString() + ) + withContext(Dispatchers.Main) { + setupRecycler() + loadFavorites() + } + } + } + private fun setupRecycler() { + adapter = FavoriteFoodAdapter(mutableListOf()) { dish -> + currentUser?.let { user -> + // 2) Удаляем ID блюда из списка + val newList = user.favoriteDishesId.toMutableList() + newList.remove(dish.id.toInt()) + user.favoriteDishesId = newList + // 3) Сохраняем пользователя в БД и обновляем UI + lifecycleScope.launch(Dispatchers.IO) { + DataBase.getDb(requireContext()).getUserDao().updateUser(user) + val all = DataBase.getDb(requireContext()).getDishesDao().getAll() + val fav = all.filter { it.id.toInt() in newList } + withContext(Dispatchers.Main) { adapter.updateList(fav) } + } + } + } binding.rvFoods.layoutManager = GridLayoutManager(requireContext(), 2) binding.rvFoods.adapter = adapter + } - lifecycleScope.launch { - val dishesList = withContext(Dispatchers.IO) { - DataBase.getDb(requireContext()) - .getDishesDao() - .getAll() + private fun loadFavorites() { + currentUser?.let { user -> + lifecycleScope.launch(Dispatchers.IO) { + val all = dataBase.getDishesDao().getDishesByIds(user.favoriteDishesId) + println(" FFFFFFFFFFFFFFFF " + all.toString()) + println(" FFFFFFFFFFFFFFFF " + user) + withContext(Dispatchers.Main) { adapter.updateList(all) } } - adapter.updateList(dishesList) } } + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/res/layout/activity_favorites.xml b/app/src/main/res/layout/activity_favorites.xml index f36a95c..0b0fbe2 100644 --- a/app/src/main/res/layout/activity_favorites.xml +++ b/app/src/main/res/layout/activity_favorites.xml @@ -85,7 +85,7 @@ Date: Mon, 12 May 2025 11:06:41 +0300 Subject: [PATCH 2/3] fix version again --- build.gradle.kts | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5d68f11..a7b2ae0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.9.2" apply false - id("com.android.library") version "8.9.2" apply false + id("com.android.application") version "8.10.0" apply false + id("com.android.library") version "8.10.0" apply false id("org.jetbrains.kotlin.android") version "2.1.20" apply false } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2c177a0..5cf5bcd 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sun May 04 14:55:53 MSK 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 4e8ef6d8e8df27334b6c7353d7c3cb0fdebb140a Mon Sep 17 00:00:00 2001 From: praes666 Date: Tue, 13 May 2025 23:15:48 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=BD=D0=B0=D1=85=D1=83=D0=B5=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=82=D0=B8=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 1 + app/src/main/AndroidManifest.xml | 15 +- .../projectfigma/Activity/AdvertisingPage.kt | 21 ++ app/src/main/res/drawable/bg_rating.xml | 4 +- .../main/res/drawable/bg_rating_orange.xml | 8 + .../main/res/drawable/bg_skibidi_tualet.xml | 4 + app/src/main/res/drawable/ic_discount_30.png | Bin 0 -> 3394 bytes .../main/res/drawable/ic_heart_unborder.png | Bin 0 -> 273 bytes app/src/main/res/drawable/ic_minus.png | Bin 0 -> 726 bytes app/src/main/res/drawable/ic_plus.png | Bin 0 -> 818 bytes .../res/layout/activity_advertising_page.xml | 228 ++++++++++++++++++ app/src/main/res/layout/item_food.xml | 10 +- 12 files changed, 279 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/example/projectfigma/Activity/AdvertisingPage.kt create mode 100644 app/src/main/res/drawable/bg_rating_orange.xml create mode 100644 app/src/main/res/drawable/bg_skibidi_tualet.xml create mode 100644 app/src/main/res/drawable/ic_discount_30.png create mode 100644 app/src/main/res/drawable/ic_heart_unborder.png create mode 100644 app/src/main/res/drawable/ic_minus.png create mode 100644 app/src/main/res/drawable/ic_plus.png create mode 100644 app/src/main/res/layout/activity_advertising_page.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3fe22b7..91853b6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -40,6 +40,7 @@ dependencies { implementation("androidx.constraintlayout:constraintlayout:2.2.1") implementation("androidx.room:room-ktx:2.7.1") + implementation(libs.androidx.activity) kapt("androidx.room:room-compiler:2.7.1") testImplementation("junit:junit:4.13.2") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9ce032b..1aadf3d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,6 +13,9 @@ android:supportsRtl="true" android:theme="@style/Theme.Project" tools:targetApi="31"> + @@ -22,12 +25,12 @@ - - - - - - + + + + + + - - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_rating_orange.xml b/app/src/main/res/drawable/bg_rating_orange.xml new file mode 100644 index 0000000..da9d1a2 --- /dev/null +++ b/app/src/main/res/drawable/bg_rating_orange.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/app/src/main/res/drawable/bg_skibidi_tualet.xml b/app/src/main/res/drawable/bg_skibidi_tualet.xml new file mode 100644 index 0000000..ee75929 --- /dev/null +++ b/app/src/main/res/drawable/bg_skibidi_tualet.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_discount_30.png b/app/src/main/res/drawable/ic_discount_30.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ec2f45a92689029c96c1575b4bb2d4addf5d GIT binary patch literal 3394 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 Y2R?OgMEgh-jsO4v07*qoM6N<$f{HVv_y7O^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_heart_unborder.png b/app/src/main/res/drawable/ic_heart_unborder.png new file mode 100644 index 0000000000000000000000000000000000000000..b29230dafc65ea4abf9cd31086bfd18276a44f05 GIT binary patch literal 273 zcmV+s0q*{ZP)D$LFnc;T8n7+$y5CITAqbh){-2o=W_D21LbB~vZ})Au9(*7LdFd4_ zI4A46QIJz@I=~O@%vWI;VO9 Xk~aEeVFRFT00000NkvXXu0mjfkjrd3 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_minus.png b/app/src/main/res/drawable/ic_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..23908c0d664c7d505b0507e4fd2f60fbb6eeae3d GIT binary patch literal 726 zcmV;{0xA88P)LxVb$9_JYAUmPh%`tPDN;t%NTf;^h13+GiJ&7j4S9p(1&~vmZf#$L z5k+#Hvvb%9nbFs>2`MJW_I@D*4BFU>eb5yg@Ly&`QUJ}%T8m?K1ag8 zi3JOv1D^r#ortry7TvD^-$twx~geket24 zerx4)w*Hc?l(jBot6-uI(b)fmg3~!R;3{xd#r`i;QpdrzMvTi54|E-40IlUgySHJ;7U&hI!}t@AnIDLvVkQBFS8%V`_@d4c8F~gwAUFG z*a#2OasU2x_UnF{&1SPoc)Y$KbLbfFXkv>A%`!vaV-C+ zOesE`oe;-t_&L5KbLh~PVk8D%@gNh@Pe<9qmk*UNeX~XE>(Dljj-2W-`gZ@{ZqRbr zy(3j(a->RCtv3B2YK!q}ahcB8Cfbfzs7vciU0J?i{}-xDO$%)`>*3~k#8(d9))fR%s z$)+2My49anT7HZ4w8u4YZ-dg)UHR(}Od6@P8ga;yc}1wQZzN00^elrRcG46G27aVg zGGwA;Z(}nSg8KBE73my1gtF0Qo)#or3(z~VP&X{L=^u> zTbH(!Z04R5SMhsJ?A#CAt^AcfOX}RcukYR6yKC0gTD5A`stIx}_Q10{JEKkWePEl1 zzGHk19Mhc#J_Fzx-!@-)7Tdt>G(un|u-WUtF$O&FScK3qBX|)bi&?n+$^~zFHXmjn@mGx{Fp(@#c|WEj6(zcmG19)Bj!$WVIIR-J~rjg?AAD01-^WzlU6 z&T-fW5u9kr7bU5{n2UW7`EaDiUz9|r6Pe>m{4Eebcd&x+&_yu!ND&_H~|1lHz-=72W%sjBz;P#6soMZQQxxb4Wv||jg z52E4LBjtA-x{dJ)zmI+7>aG>RrSCsPR>oy$H&(Q8q*6W4^cpKMzf!5b8qjI1bQ-2o zz3gA}`VdS(=_RsHEg&kLhN*O1zn$%GC&e=UT$HfP0W(iL9hHunQe^%?0dp<5k5}9v zudDtJL>A!`#0t9R0dBlDcnYp``&*<&n3I`T%T%j5U8YjauD@N + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_food.xml b/app/src/main/res/layout/item_food.xml index 1053fe7..e5ea760 100644 --- a/app/src/main/res/layout/item_food.xml +++ b/app/src/main/res/layout/item_food.xml @@ -34,10 +34,6 @@ app:layout_constraintStart_toStartOf="parent" android:layout_margin="8dp"> - + + +