B9mzMRO?|cqTx)E-SQT&|S0aDfk`O*YdV$}m
zh1eoUaDM8x$N>`>p_J5|zG4()#~n((WtZ(*NK*{GBM8AuUb%!-4C$qk-ib(ihe642
z5}YA-lU3h(%Kp&PJEMQQK%Su|-`qf*d_)4Bw0ISxG@Xplb1&Bb0Y#)k?K%U{pfN>`#
zl+eQP`vpBvoIOb}+`=pml>BxfQj=Z>pukhwzEYs%D|!3!{8tJ@ihqa|fri8)`Lvn<
zk2I+cA~u)@O{NdTehLEORg@KQZ$!yl*v=$fa|!$dM-MTgE1m#`00000NkvXXu0mjf
D79?%e
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable/ic_drinks.png b/app/src/main/res/drawable/ic_drinks.png
new file mode 100644
index 0000000000000000000000000000000000000000..411c41ba4ff0947d2512c3b3db1625c471ed03b1
GIT binary patch
literal 1223
zcmV;&1UUPNP)m&~L?f^;o{6cVia;X*30)ErNWFn3fH>^3
zNqhct=O3E(?)S_LUscz@Id|^uf4WbfWoBfgA|ldoHsNg1S>&uE)xmpLB)(VES;IcB
zFSrMdI(yl5px;E!+RnzTAGMKK$gFyy(#AhyS7V%0y1j-PNn;XfpfP0L)PzJlZ^*AY*!M?*6&1Qh-tPn
zH{}KGyq~sRX=JCLyWo+1#~?wfLD0$S7u%J^q}AbZ9b*z#lA&<)b;*nQ_3W1I$^#Yn
z|M4Votsfdpw?E4ZwyOx2Q%~aPRN{PpM-H76`}4Ejj#av#@95i-9DHcWUh9=NT!S_g
z0K#GbJKOl#YcI(~l%!&G;ONHv>pf>^7z=PdsZSfCg7SR$X~F-${q~7{L>Zb|P-J`a
z*mVxmvCfNo{*&KpzxHE5JB>cHAAD?i!*yt5KMKIs^V|OKis?o=6w|OhdGHg(e4#56
zQiqiamNh{lwNAgUdE>nT(14((ZO!9%_Y=0CCS%*7pN=j?;rymbNr=@ErN|mAR$AsH3Hs|Q8r$tSvWE1+xPnmKjxkn~2!cv)
z4VX^4M6>jAV#L_MWXVE+S40HuWc$ry{~n|$UJ=2XbReiS{A7_XoKLKvJoMbNKmX3Z
z)-2neN`e5#i=T6xKuoS>1hG1B*Hq!ZSCc1ffs*8nSpu!69iU=$bu6bvq4_1vS=k`b)2
z7wQpIkUq7s;|MSs`VfQ#0jq@&1Qi6BQdss_k`6(brif$+f(v5Wu_O~LUXfb5tOwe9
zUn005Iu0lG;uXMYor)FC;c^Ks2ym>}C~5i;9Z+fekcZwIrNPt;vBFmP?L%Z+LqI`E
z)ecZlsAAA%1%gU%!Sg6`=pMRUckx?rd`}vbBIj&b#iIsI2x{2Yy4dAS8a&&>jx`YD
zJevzv7<56%t6ogItkf()q)$$pwzn!wx1xKSfN9s(g76h&5ST{(=+{*;IEwv{21NsB
z5D?Gn15~@Qo}jL%8GA()IDX(DQ!mRf&hT1ub9WIPB?wWfJ(hUZ21j|;z)c+u>p5J9
zYXU4zBeBsT68|Ql7W&K%&LXvtcG|F!Lp!4h!FdHFgY4ffNPyJaZ52y5im6c$vcEJY
z65uxqINn0Ec3qT^cG{3`Xh-2lTN)K$#rmC!#N(;-A^reamZUF=^N;}P*9VHFSsD`m
zb|Er19R{et6V|^qJ`npU6p%WT
lGTs|Wd@pQg;#G46{sC_nR(jS~SW^H1002ovPDHLkV1f|gKE(h4
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable/ic_heart_border.png b/app/src/main/res/drawable/ic_heart_border.png
new file mode 100644
index 0000000000000000000000000000000000000000..cbf94dcd2d7dae6ce846c038c733c72385cdd489
GIT binary patch
literal 740
zcmVexmumtQ~0v$v1s-&c>e6o=!M>3_dw
z^8Da+>%959r}FB@k&&~DRAZ$3|U#tQEPz2F4o;#d1;QWE~rI`Gx0fXOUE}
zj)N(B6svG(ZBi-R|Yjtg(2%h^vuD3zR1;sbF(w5jl8%t_
zYj&B9G>NhwZ;ghQU*j?xYZ4ecQsKEcaREcE)qDbzg0~`w*j@$Le!wiicW&>C(VIGA
z#;OJeQYp6o&H%d4vov051U99y%%tE)|z5nIW_+LmH?O2I_2`naresDg|3|Y0@N=xPXR0
z*laG48xi_#|Bm)V@BN~xAEGrFwmlIYS?{@~nom0hc?
zOH1BwDCiqa>hdf%VAv$Obaa`Lb_Am`A&chSModS=5~eRSt47l!RV2FHmG(74jki}^
zEJ!;mQJIT%#f2(4+wZI2Pj9IoH!rFF>p69Huv^q0eqJlKk2XGDs6X2HpiX~$%Pv$6
z0?4Ga+ev;xV|JIGr(#(Cc30B+{pH1U|KQzHA^0TuGO&%`tvgr56-((#yR9fsH~aH`
zr7)`h=1IB@A%KGLOA*Jqm&|QGgoc#6pKfqZo>7;d53lCE&>0W_hA0TkN*yWsz?8}&
zNn`eMgMU4`mhO*O5F+r!@uad??*)4YhJg_a0)wunvflB6W2dK$BV!N*&U;A(^bU<;
zL<3_I)HVer@@O6K-hdG@+>S|5k78Q#NL}b|J1-v$)Q?FJXhBe0*472t0F1y3)1`jWa0|bo_O*cmStc-;3=?f>yoL9I$o!a%zOk!4M!&j~)b4pp8g^
z5(x618n}!Yqo5uHdE+v|C1|fRFIr}tXg9=h87+Mni6Bf3u#b#_QwkHNPBL2h5F`k>
z8w{x$Lx63OiJR>YKdluHMg|ujf&?+_a*{@Df)L#pMDU9UxjlEI5VODh%D93*L4r7;
zlg8Kt0fg!8$JYxHsW?4uFy)9vkRXl?JZ%$~Ai#52Y;8ga67+AsU%1gpvRTxZ3F4UH
zd1jU#gCIeGZiin|CWs*%5e>hb6viT05C%KlhpRbdg7^TC^6gF>Tif+zyQU12|jXo3L82a6PhAY!_i>3*?@DhOaq_3|e#
z1<@7pLInqJvvFh_YraGkR6OzAP$`HZn>iczDKG{>(+3l-FQC{~f`FVx@SKRDJDolx
zvepMvge%I~f&gEzwk+I(bqMmFf}5DjSuR1$o<#(4;)t1P*p{U}GPJxCFWCJ(wy4<)Rj3i@HeTZFMfgUG)t)?;S%B
zddX`nN#kvGGH{RxE|)0TJ49vwNob611yu?fVw5ZY?}GAhJq86XmY8XftsSxoBESAM
zr2L~XQ4Rm2U@m;Xbr>WtM>1iEMlYcq1$yRk>(Xu~DjQFY7V+g=2u31nkkoBgL08#6
z6jz}dx*rTfFQAkqn|R6AY3HDxo4HWge-{#Q(Q$wXJR|M%LSCBDe#o$E>?v)
z7nYcJ8xrV|wi<>I8~R4m`3*6jLICl4Dd*taL}k~)bSBH1J@^m4Y~dSmK1oUd0000<
KMNUMnLSTZ-W)$fF
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable/ic_snacks.png b/app/src/main/res/drawable/ic_snacks.png
new file mode 100644
index 0000000000000000000000000000000000000000..8077292390bd6c3decbbaaca3e1ea0be941a0129
GIT binary patch
literal 1500
zcmV<21ta>2P)rpnM+>TO3nTFwD
z?7h&;HHotB-?tLP7hR6>*<68Dql&T>WzFlcG(tn|+Yk^yE_=N@
zF(0rrAOI07e|-3Acz!tZU58-D>zzax$<45YNF3k)DLmW#Jv{pO_4@yR@7(g;ha&HO
zvBP_Q#85o`;{96r$6tQXwjF-E*}C3{xaxV-h!5666G@iF(cSM`>l|#K8vN<~AM3X1
zr*E0wOM?h}em{jK)-MfQjeR0Q`&-xBXGeGMoU__UIO}?$vCh&Us%f9>zVk}`_tCXC
z+UE)qBkm!KQ!9l5){WTh#DIw6HTSaGXxN^mnRh_@nE(*7dA;MyDmV<1bYOCg}WU)@JTq$Pxl5C#5j^N%f%498yGlrT`#fNim*a2o}?MMs!Ohz=Zf5iiGUlfOQEKYlxColp(~jd2ubq(q_l8>a=SN>2qb24fvhVlttB3Z{5Vun(
z736CE)b}Mg)@N@1Dwp#qQ6V|4?9J)KKlK=T{gfgEQYCmwa827UQ$lQ6LVSYEqEzg4
zp;XHdMU^hqsglXCNu}hHJ@(OBOK48&hVS8_i^rUT9#RC?D#4cW{vN_+{Rx~}#}L9w
z*}Vj8joJqh7;CbZ`g<{>b^0m*;LBUr)J5L1c
zgw%)P5<*Y+yI}Nlvo3_@w+oe<^hJOOyy5j5gwT8?-#R=0g#u4m+{H==r^G7zwiN-3
zOu{ONq!3?pW&T3yDFR6GP|kp{RcPj-oN2P=0r(e!suj`>l-!*F0000^LAFvoHSv85AAMfO=wf82hVOv
z*Vj0-ksWU(gn`b6_Ty{9-pWZYO~d8wzrco<#`u6pzKwlg>Ly;Efj{2aqc^R4P{0#fC2O3u6}M*NK-T
z;~me4{mC`i{q<`5|KsLQ`$!cq0R5p~n`a2^Oc;-~L5=;Cz%%R=Dz+EG;pp)nt+Ij4
zAiaR6IeB;mi-z%N+`;Wz_7TmL#*FMI8YDV8L(-Gy-+#7L&uHj%G=>`I01svu!Jx6d
zN|5|iF}y>-;cwk4V$~qQtKeW3;t&W#z}pZF%&+~lm)2nr_8=}=k_o-DEFthfICE@z
z393iWy$&HC;cm3dVeVj+i0%{(gW|qr!U$kP2r^IUImmj11_rrX1Gt%;S~-Q6tP0^>
zR4A_tz#EvLH-^1NufebgQy3J5GCDU*l{3g6oxp5~aB$(vnGFlYg~1pIcRNN(jFJX%
zg&@;8_BO7y_d;q*(P5nv7=#@cm;&VyH3$mF6)Ss~KyM9lvJQ`89B+$}LT^{Re02@t%H>ws
zqa-YbvNIDB&$F&UOuo`^)7Z*l+2}o(CswXOOz=`cAbp<0#Nfr01beWqL!s>98id^>
z9_qVs>+>8Z);Bca`P6f+L0W?QK!Zv=#4@I@@NjN1sdo+1@(9=Fw!=L2VQgDTJ#L<~
zio`t>;KaDvxtfq;4PE3tP1EGp{B?gOcjQ7W7Gj@h|?~nbnNw$5S><(ja0z
z;5F?*Z`TR1KT-}?Rp?e?LuSNnifqhY#+)8}lw#=Oy@L1SVktv%U-LD4OEDexeT(#N^B+-G7l
z`L)MtHir)F798J`4hEj$uZoB@=BBzJgo|r4yy$
zvFf0LwYfnvqi)zcYGAIUicW^2KJy#MiFcGi@Y3L1VtJp+jaGH`v#4iDpMT@Zn
zgEqzcqBw_Ch97pPseKE)2=S;nCX>=Iiy_@_7aG&)hX4w^Zs%8pbl;Ls7W+R{5Gnmb
zEQg#J*67hz1Uxd9RT$zC20A|*5c??z$dH#Zo^7P-3)`8lYOdgasd%R|3mv}H00000
LNkvXXu0mjfV%*JD
literal 0
HcmV?d00001
diff --git a/app/src/main/res/layout/activity_favorites.xml b/app/src/main/res/layout/activity_favorites.xml
new file mode 100644
index 0000000..f36a95c
--- /dev/null
+++ b/app/src/main/res/layout/activity_favorites.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_favorite_list.xml b/app/src/main/res/layout/fragment_favorite_list.xml
new file mode 100644
index 0000000..9a2dd1d
--- /dev/null
+++ b/app/src/main/res/layout/fragment_favorite_list.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_favorite_food.xml b/app/src/main/res/layout/item_favorite_food.xml
new file mode 100644
index 0000000..2845c4c
--- /dev/null
+++ b/app/src/main/res/layout/item_favorite_food.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 2/6] =?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 3/6] 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 4/6] =?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">
-
+
+
+
From 9f35fa1008368db29df649f23f09a051fa5a8e74 Mon Sep 17 00:00:00 2001
From: praes666
Date: Wed, 14 May 2025 21:19:21 +0300
Subject: [PATCH 5/6] =?UTF-8?q?=D1=87=D1=82=D0=BE=20=D1=82=D0=BE=20=D1=81?=
=?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D1=85=D0=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/src/main/res/drawable/ic_add_to_card.png | Bin 0 -> 3618 bytes
.../main/res/drawable/ic_heart_in_circle.png | Bin 0 -> 806 bytes
.../res/layout/activity_advertising_page.xml | 256 +++++++++++++++++-
3 files changed, 251 insertions(+), 5 deletions(-)
create mode 100644 app/src/main/res/drawable/ic_add_to_card.png
create mode 100644 app/src/main/res/drawable/ic_heart_in_circle.png
diff --git a/app/src/main/res/drawable/ic_add_to_card.png b/app/src/main/res/drawable/ic_add_to_card.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0cd87eca1096f1a3c9a61db933335bd72fab7b0
GIT binary patch
literal 3618
zcmV+-4&CvIP)#^a$OpXdOL(9BA!i(dyP9$|8Xmv6bv(+1d&5AO@TSh>;QOl?_PR*iHZg
z5)fw*En*`VB+eq^g&n{Prww?ZzDP5z8EK@keChD-nQB%4JYT_0TV@06c6YPy3O~YU;R#NEzq>n
zy>{amYn@kygMcWHx~;Krz>1tzivCQIvQv
z;8<$RTD@mQQIyn-OYy3w1A_DYM
z6h+C4=0avF3FZMNx_b(F@jN(dzo5BzVuZ7(dwf+hqLa
z+GKp?h3UWd|M91}@h)L4&~D{i)4`2J+)wHIe>|KdlXGHF4(*mVLf
zqbPMC(wjaCUi9{rWU*#=&~@;pA#4yx8!l4>5B{(|vF-84{|uE$3-+Cj%N#{85RMzx
z-XE_{_CNgd^Mx-z{uk@o
zP+^8q1FYF`h(m^}Q;yUr&`r5cFd^suHG9ryo!Fd&G5LS7b!S#S5&
z??cOc0G&}X2q>4$8x`r|faeUcUBon0RDA|#TI(dxjW!pm3&?-YBDN@>Mck`GR7d{i
z!A_`b-l#|y18%(Vh!?doo~D$A8PADyT|*t4QjfD5#7lj75Mze;eFj
zqwH~TJbUk5o$Ll)GPr;3<>}w}-L^;XzZTc5gS>?<2YXf?1YFUEWr8zEsW0*G~0-|-<07@{-t1;2asm!Wm@LPa`1q~p#a
z&_3cz8x_g)eI9VBd4Z4E-ZSFJ+pjzu2HOgRgx&k~bD?r|gpa+dZB!(itBsQ@gYNO0yudfc
z>lbI@x%2j`bIbA`I7IzsTle0Y-&Pg)s`tsB^`EU;j4VvLwWLi}bY4je|PzFE3jr5M4Gq_KXg0Tb7F+Vu{&p
z_RKc?ZBLR&E7GP;d&V68wzE+35NVtr)C2fthPba;23(UqqrNR51$V5Y@<4GyVJT5c+#!Ud4X>j&vxrq&xV#|
zos<$M(&H;nJoh38;L^eaOzd^x!nQ3<&NMoNYla)PkMogKq*2yYCzcyQVB`8+NEs4Q
z7Ig!Ih`9C{22oq|+CZp^jmzXol4HAncwYF1&(|8?U~ukT6LGLSk2b0k(+m&((Kqfs
z|MU})zI-mU9D)i@d;682hL**Fn0C~9_BKc7t8+K!3mmCaA0QX+Ml=wWru)RgRJ$~H(s`uYenY@4}oAlTq
zv{^(tPN2>Di?&hi=(MhRFVb6qn3nC;Vmoo(`!e9%Xk-9z8Gs26wwZy&DB{EvqOt$)
zTcHUP@X&3OL^`fcbXcxa5)iJ_MbtJWV*!vtNif{>z6t6Dl0E+4Cz-EHe%zPNV;;m!
zl!y0Y4gZ
zr!jEYz?CyCc|Yh}oC1cw*}F2v;v#im+*CN;iaIe_Bg%MRU7&sg3n2F0Ue3qI;sK%A
zz54Q8?s3#P$SNkhO+Jr#0TE`yZ+s44(_lpE|UhXFHQisEDI7Nor5fI
zo|C-tEMgyrG#k~`#?p1c=Y+3GSe)Y^!RI}$jq1vD;L!IJJmb-powGc9Pjv;p-olT?
z=x9iBib5K}mj)0yOC#yP6^n~4(ozRcB0MZ6FfNmZGy=ean?!8bo5o-&mvJE-a~83W
zgWJkAMq%J<&Lz@mGKman+NiGdJFPYEC$pFVyt3b^VW;8ovNDMp&`N7k2VjxrutgMc
z>v88z`UuYhqcAR$hBN}e=JGTF3oMIR5~Qb&sHdK+q&W{Zt}&3T?QD~E-)cp>(e`>;
zxGVjxNUD;CC&hrXnB?iO*e3O|c)dJCTJpfTOd8S%09#oi4R}9cQDX>MV6lxm4>r7C
ze0*8kIc^(C_pMG$r-ftMAusR+`}>7u3nd0zW;ci>rs45p=OV@-4;GrF9gRD_Ez*+b
z?_0Qo&yxh-JhOy5fOK=h4V7p3Wrf2XNj-JG?o_0UVfq%le%s#<(3C`Qf|34u_!4V
z--bb`)5fPIVV7=xt_e8Ob)h1iKY;`N!Qm_aS5`*d)|dmn>OO|b)$dwJEvzNjc;jj0UucQgpy@?^4tlsPMF{h%AGjQi-Q25^M!@L?cqza
z+>D`476YXJv2mSgkZwMJI2A5DLH5T72ZOqfeix6ok%wrqh)N4hj
z*_#QpF&{%7%buFOtSRY$MT|R1QY5dIJ8>FufVgo7l|&lCAPKKz5CmyIxz035PZ73B
zH$4b-((?ere%n)^^TKt5i8JiKG+Q!l8}rSbuRp#9vWPVHDXxvO)aeT&%rs;hc3Nv(
zu*#qV&9W;>PQNqEz1*q9>=H?^l1#9Of;)l~`$LD}j%gd}FyR*Nppr-%;sghEVmZo5
z$INx51%r7}!h~(}%?h~A1I)bFgV)Uyvma6W&xRWY1_|SC8m?o*w#;?L<%$q#;A$gj
zFtiR#Q}5XN=lsg@uv6ghc`IIC2FuEoMn~gJ4K9<0H1%N_Iy)Xk(J}EaIfq
ze3AAt`(utPX&d>g1Amm}ZX-q6BOQ;b8HxpT~{kVx3ilQh<5HmWWY}jqIxq_-J@C<3#D#6~EE;&wD$t6eR
z+CkXEpAP~c@S
o=vAOw{WHz$@Rp%xWqHj12Zf+!cs8V6=>Px#07*qoM6N<$f{i)@%m4rY
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable/ic_heart_in_circle.png b/app/src/main/res/drawable/ic_heart_in_circle.png
new file mode 100644
index 0000000000000000000000000000000000000000..49217e64cb566c1f8670610656c364b3bb0b299a
GIT binary patch
literal 806
zcmV+>1KIqEP)1gh5XbKkc!cwX9v%Rs)KuXd1PvVsYS&1lN(CZmlOkzC%DAC`288I%3m_vAarQaf
z+968ZE&E^RY-e`wydQVA80n{2+1;7HW_R}Eg22(b8{w^FBV7OeFxu%gqmzC!>ZZ+z
ziN737em6S3X5(`bM_cGiebj2XxOq{g$T4wrAbf<>Z)FC7$PNweip+GCf-%Ku9KNH0
zssg?dgT}S8
zQTJCXa)MX}r3F@Jb=v|hRG+l#DOU!pl4MhJnxz$P=2d}1;f6@tY^G1|@NBomM<;vy
z{Nphn9=+v*7x$EYXRQaE?Qh9G=$q}dls=2Nk=3NxIHVnlK=8|7Klpe&Ru~?=nf4pC
z_mp;kvG76t7SR*;im6c3Jrh~G$_7gCdCor_OX&aSxyn)-u}tm&xNK+|wG?I2g^SKt
z#eWfU`f*pJ4LZ(VJywGG@<;fjadgP(H?4LQ3=QN9+kdUZ(IKk84WS*{pra0<@JZun
ziKDJ@Az_=LfqXH|sDK5Ue`>*cqJey|sC;fL6rfURFjxM5`=IzQ!+7e!;N^XOdFsDK
z!3TU%|0S?MJavC+8Vd0h>mZWj*)4>wwbh1l5NOc}rNd36*zn`EF99}F+F$|-!A30l
z+7!<`IFte$Pqe`lQ?WiGL9%&!Jz#jZTND%}+kUPHqh#C9lyMfY>FvpN`g54Ln^JK(
zXrujYNaN^WD%5BCb97>d<|j`f%8S(Wa#F_V{p>z~-?ZHpS?$!S$SQ!qDntS$o4JXi
z@>;7^A`YV26NDOefd2pR0Rn~>sn2%hjm?+6RedBwOvI*oN(}@0OI!v{B6C~Xmpz;5
zF0$(*wzk~>)xEHAYz*1$i4B+ras|HRWuq>eEQiLSOR-@L?iIBP)ENTet|&7dN8jhg
kOHtzWfQxx9&S#4M0cJPCz~D-g{{R3007*qoM6N<$f*5;
+
+
+
+
+
+
+
+
+
@@ -220,9 +260,215 @@
+ android:textSize="16dp"
+ android:textStyle="bold"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="0.099"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/dividingLine2"
+ app:layout_constraintVertical_bias="0.0" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
From 8e526934bd8345968092efca360799c1abcff28d Mon Sep 17 00:00:00 2001
From: Egorick <112876399+Vooidss@users.noreply.github.com>
Date: Thu, 15 May 2025 14:37:56 +0300
Subject: [PATCH 6/6] =?UTF-8?q?=D0=94=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB?=
=?UTF-8?q?=20=D0=B1=D0=B0=D0=BD=D0=BD=D0=B5=D1=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/src/main/AndroidManifest.xml | 1 +
.../Activity/AdverstsingPageActivity.kt | 25 ++
.../projectfigma/Adapters/PromoAdapter.kt | 7 +-
.../projectfigma/Fragments/BannerFood.kt | 56 +++--
.../res/layout/activity_advertising_page.xml | 229 +++++++-----------
app/src/main/res/layout/item_banner.xml | 1 +
build.gradle.kts | 4 +-
7 files changed, 160 insertions(+), 163 deletions(-)
create mode 100644 app/src/main/java/com/example/projectfigma/Activity/AdverstsingPageActivity.kt
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1aadf3d..6b04610 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -31,6 +31,7 @@
+
) :
+class PromoAdapter(
+ private var items: List,
+ private val onBannerClick: () -> Unit) :
RecyclerView.Adapter() {
inner class VH(view: View) : RecyclerView.ViewHolder(view) {
private val image: ImageView = view.findViewById(R.id.promo_image)
private val title: TextView = view.findViewById(R.id.title)
private val discount: TextView = view.findViewById(R.id.discount)
+ private val fullCard: CardView = view.findViewById(R.id.fullCard)
fun bind(item: Dishes) {
title.text = "Experience our delicious new dish"
discount.text = "${30}% OFF"
+ fullCard.setOnClickListener { onBannerClick() }
}
}
diff --git a/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt b/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt
index 56d489c..54f85e8 100644
--- a/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt
+++ b/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt
@@ -1,5 +1,6 @@
package com.example.projectfigma.Fragments
+import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.os.Looper
@@ -7,7 +8,10 @@ import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.widget.ViewPager2
+import com.example.projectfigma.Activity.AdverstsingPageActivity
+import com.example.projectfigma.Activity.LogActivity
import com.example.projectfigma.Adapters.PromoAdapter
import com.example.projectfigma.DataBase.DataBase
import com.example.projectfigma.R
@@ -15,71 +19,73 @@ import com.example.projectfigma.databinding.FragmentBannerFoodBinding
import com.example.projectfigma.databinding.FragmentBestSellerBinding
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.isActive
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
class BannerFood : Fragment() {
private var _binding: FragmentBannerFoodBinding? = null
private val binding get() = _binding!!
private lateinit var promoAdapter: PromoAdapter
-
- override fun onCreate(savedInstanceState: Bundle?) {
-
- super.onCreate(savedInstanceState)
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentBannerFoodBinding.inflate(inflater, container, false)
+ return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 1) Инициализируем адаптер
- promoAdapter = PromoAdapter(emptyList())
+ promoAdapter = PromoAdapter(emptyList()) {
+ val intent = Intent(requireContext(), AdverstsingPageActivity::class.java)
+ startActivity(intent)
+ requireActivity().finish()
+ }
binding.viewPager.adapter = promoAdapter
// 2) Настраиваем TabLayoutMediator, сразу задаём иконки
TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, _ ->
- tab.setIcon(R.drawable.tab_indicator_unselected)
+ tab.setIcon(com.example.projectfigma.R.drawable.tab_indicator_unselected)
}.attach()
- // 3) Подписываемся на смену вкладки, чтобы менять иконки
+ // 3) Слушаем смену вкладки для изменения иконки
binding.tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
- tab.setIcon(R.drawable.tab_indicator_selected)
+ tab.setIcon(com.example.projectfigma.R.drawable.tab_indicator_selected)
}
override fun onTabUnselected(tab: TabLayout.Tab) {
- tab.setIcon(R.drawable.tab_indicator_unselected)
+ tab.setIcon(com.example.projectfigma.R.drawable.tab_indicator_unselected)
}
override fun onTabReselected(tab: TabLayout.Tab) {}
})
- // 4) Тут же можете запустить автопрокрутку, если она нужна в фрагменте
- val handler = Handler(Looper.getMainLooper())
- handler.postDelayed(object : Runnable {
- override fun run() {
+ // 4) Автопрокрутка с помощью корутины
+ viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Main) {
+ while (isActive) {
+ delay(4000)
if (promoAdapter.itemCount > 1) {
val next = (binding.viewPager.currentItem + 1) % promoAdapter.itemCount
binding.viewPager.setCurrentItem(next, true)
}
- handler.postDelayed(this, 4000)
}
- }, 4000)
+ }
- // 5) А обновление списка (LiveData) можно тоже повесить здесь:
+ // 5) Обновление списка из БД
val dao = DataBase.getDb(requireContext()).getDishesDao()
dao.getBestSellers().observe(viewLifecycleOwner) { list ->
promoAdapter.updateList(list)
}
}
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View {
- _binding = FragmentBannerFoodBinding.inflate(inflater, container, false)
- return binding.root
- }
-
override fun onDestroyView() {
super.onDestroyView()
_binding = null
diff --git a/app/src/main/res/layout/activity_advertising_page.xml b/app/src/main/res/layout/activity_advertising_page.xml
index fcf0c10..01f1994 100644
--- a/app/src/main/res/layout/activity_advertising_page.xml
+++ b/app/src/main/res/layout/activity_advertising_page.xml
@@ -1,23 +1,24 @@
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/background">
+
+ app:layout_constraintTop_toBottomOf="@+id/constraintLayoutFamiliar">
+ app:layout_constraintBottom_toBottomOf="@+id/tvJumboTitle"
+ app:layout_constraintStart_toEndOf="@+id/tvJumboTitle"
+ app:layout_constraintTop_toTopOf="@+id/tvJumboTitle" />
+ app:layout_constraintStart_toEndOf="@+id/tvJumboSeparator"
+ app:layout_constraintTop_toTopOf="@+id/tvJumboSeparator" />
+
-
+
+ app:layout_constraintTop_toBottomOf="@+id/constraintLayoutHeader">
-
-
+
+
+ android:textSize="25dp" />
-
-
+
+
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent" />
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent" />
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent" />
+
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="0.346">
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"/>
+ app:layout_constraintStart_toEndOf="@id/tvFamiliarTitle"
+ app:layout_constraintTop_toTopOf="@id/tvFamiliarTitle"
+ app:layout_constraintBottom_toBottomOf="@id/tvFamiliarTitle"/>
+ app:layout_constraintStart_toEndOf="@id/tvFamiliarSeparator"
+ app:layout_constraintTop_toTopOf="@id/tvFamiliarSeparator"
+ app:layout_constraintBottom_toBottomOf="@id/tvFamiliarSeparator"
+ app:layout_constraintEnd_toEndOf="parent"/>
+
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="0.336">
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"/>
+ app:layout_constraintStart_toEndOf="@id/tvPersonalTitle"
+ app:layout_constraintTop_toTopOf="@id/tvPersonalTitle"
+ app:layout_constraintBottom_toBottomOf="@id/tvPersonalTitle"/>
+ app:layout_constraintStart_toEndOf="@id/tvPersonalSeparator"
+ app:layout_constraintTop_toTopOf="@id/tvPersonalSeparator"
+ app:layout_constraintBottom_toBottomOf="@id/tvPersonalSeparator"
+ app:layout_constraintEnd_toEndOf="parent"/>
+
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="0.323">
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"/>
+ app:layout_constraintStart_toEndOf="@id/tvMediumTitle"
+ app:layout_constraintTop_toTopOf="@id/tvMediumTitle"
+ app:layout_constraintBottom_toBottomOf="@id/tvMediumTitle"/>
+ app:layout_constraintStart_toEndOf="@id/tvMediumSeparator"
+ app:layout_constraintTop_toTopOf="@id/tvMediumSeparator"
+ app:layout_constraintBottom_toBottomOf="@id/tvMediumSeparator"
+ app:layout_constraintEnd_toEndOf="parent"/>
-
-
-
-
-
-
-
-
-
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/item_banner.xml b/app/src/main/res/layout/item_banner.xml
index 2cd74b0..ed9debb 100644
--- a/app/src/main/res/layout/item_banner.xml
+++ b/app/src/main/res/layout/item_banner.xml
@@ -1,5 +1,6 @@