Skip to content
Open

hw #16

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ plugins {
alias(libs.plugins.kotlinAndroid)
alias(libs.plugins.kotlinxSerialization)
alias(libs.plugins.kapt)
alias(libs.plugins.compose)
}

android {
Expand Down Expand Up @@ -34,6 +35,11 @@ android {
}
buildFeatures {
viewBinding true
compose = true
}
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
}

Expand All @@ -55,15 +61,22 @@ dependencies {
implementation libs.lifecycle.runtime.ktx
implementation libs.navigation.fragment.ktx
implementation libs.navigation.ui.ktx
implementation libs.navigation.compose
implementation libs.coil
implementation libs.gson
implementation libs.bundles.network
implementation libs.kotlin.serialization
implementation libs.kotlinx.serializationJson
implementation libs.androidx.datastore
implementation libs.androidx.datastore.preferences
implementation libs.compose.ui
implementation libs.androidx.material3
implementation libs.compose.foundation
implementation libs.coil.compose

implementation libs.dagger
implementation libs.androidx.runtime
implementation libs.androidx.foundation.layout
kapt libs.daggerCompiler

testImplementation libs.junit
Expand Down
139 changes: 124 additions & 15 deletions app/src/main/java/ru/otus/marketsample/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,26 +1,135 @@
package ru.otus.marketsample

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import ru.otus.marketsample.databinding.ActivityMainBinding
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import ru.otus.marketsample.products.ProductListScreen
import ru.otus.marketsample.products.feature.ProductListViewModel
import ru.otus.marketsample.products.feature.di.DaggerProductListComponent
import ru.otus.marketsample.promo.PromoListScreen
import ru.otus.marketsample.promo.feature.PromoListViewModel
import ru.otus.marketsample.promo.feature.di.DaggerPromoComponent

class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding
class MainActivity : ComponentActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

ViewCompat.setOnApplyWindowInsetsListener(binding.container) { view, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
view.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets

setContent {
MaterialTheme {
MainScreen()
}
}
}
}

@Composable
private fun MainScreen() {
val navController = rememberNavController()
val context = LocalContext.current
val appComponent = (context.applicationContext as MarketSampleApp).appComponent

Scaffold(
modifier = Modifier.fillMaxSize(),
bottomBar = { BottomNavigationBar(navController) }
) { innerPadding ->
NavHost(
navController = navController,
startDestination = "Products",
modifier = Modifier.padding(innerPadding)
) {
composable("Products") {
val factory = remember {
DaggerProductListComponent.factory()
.create(appComponent)
.getViewModelFactory()
}

val viewModel: ProductListViewModel = viewModel(factory = factory)

ProductListScreen(
viewModel = viewModel
)
}
composable("Promo") {
val factory = remember {
DaggerPromoComponent.factory()
.create(appComponent)
.getViewModelFactory()
}

val viewModel: PromoListViewModel = viewModel(factory = factory)
PromoListScreen(
viewModel = viewModel
)

}
}
}
}

@Composable
private fun BottomNavigationBar(navController: NavController) {
val items = listOf(
BottomNavItem(
"Products",
"Products",
painterResource(ru.otus.common.ui.R.drawable.ic_list)
),
BottomNavItem("Promo", "Promo", painterResource(ru.otus.common.ui.R.drawable.ic_discount))
)

NavigationBar {
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route

items.forEach { item ->
NavigationBarItem(
icon = {
Icon(
painter = item.icon,
contentDescription = item.title,
Modifier.size(24.dp)
)
},
label = { Text(item.title) },
selected = currentRoute == item.route,
onClick = {
if (currentRoute != item.route) {
navController.navigate(item.route) {
popUpTo(navController.graph.startDestinationId)
launchSingleTop = true
}
}
}
)
}
}
}
}

data class BottomNavItem(val route: String, val title: String, val icon: Painter)
49 changes: 0 additions & 49 deletions app/src/main/java/ru/otus/marketsample/MainFragment.kt

This file was deleted.

Loading