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..6b04610 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,13 @@ - - - - - - + + + + + + + ) : +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/drawable/bg_rating.xml b/app/src/main/res/drawable/bg_rating.xml index 3dea9c6..0c63dd9 100644 --- a/app/src/main/res/drawable/bg_rating.xml +++ b/app/src/main/res/drawable/bg_rating.xml @@ -1,4 +1,4 @@ - - + + \ 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_add_to_card.png b/app/src/main/res/drawable/ic_add_to_card.png new file mode 100644 index 0000000..f0cd87e Binary files /dev/null and b/app/src/main/res/drawable/ic_add_to_card.png differ 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 0000000..4483ec2 Binary files /dev/null and b/app/src/main/res/drawable/ic_discount_30.png differ 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 0000000..49217e6 Binary files /dev/null and b/app/src/main/res/drawable/ic_heart_in_circle.png differ 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 0000000..b29230d Binary files /dev/null and b/app/src/main/res/drawable/ic_heart_unborder.png differ 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 0000000..23908c0 Binary files /dev/null and b/app/src/main/res/drawable/ic_minus.png differ diff --git a/app/src/main/res/drawable/ic_plus.png b/app/src/main/res/drawable/ic_plus.png new file mode 100644 index 0000000..aba45e0 Binary files /dev/null and b/app/src/main/res/drawable/ic_plus.png differ diff --git a/app/src/main/res/layout/activity_advertising_page.xml b/app/src/main/res/layout/activity_advertising_page.xml new file mode 100644 index 0000000..01f1994 --- /dev/null +++ b/app/src/main/res/layout/activity_advertising_page.xml @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ - + + + diff --git a/build.gradle.kts b/build.gradle.kts index 5d68f11..25f88c7 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.8.2" apply false + id("com.android.library") version "8.8.2" 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