diff --git a/app/build.gradle b/app/build.gradle index 62afee5..0361e6c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,6 +68,7 @@ implementation "androidx.compose.material:material:$composeVersion" implementation "androidx.compose.foundation:foundation-layout:$composeVersion" implementation "androidx.navigation:navigation-compose:2.5.2" + implementation "androidx.hilt:hilt-navigation-compose:1.0.0" // Glide implementation "com.github.bumptech.glide:compose:1.0.0-alpha.1" diff --git a/app/build.gradle b/app/build.gradle index 62afee5..0361e6c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,6 +68,7 @@ implementation "androidx.compose.material:material:$composeVersion" implementation "androidx.compose.foundation:foundation-layout:$composeVersion" implementation "androidx.navigation:navigation-compose:2.5.2" + implementation "androidx.hilt:hilt-navigation-compose:1.0.0" // Glide implementation "com.github.bumptech.glide:compose:1.0.0-alpha.1" diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt new file mode 100644 index 0000000..711b54d --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt @@ -0,0 +1,26 @@ +package fr.tf1.player.atelierplayermvvm.ui + +import androidx.compose.runtime.Composable +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailScreen +import fr.tf1.player.atelierplayermvvm.ui.list.BookListScreen + +@Composable +fun BookNavGraph() { + val navController = rememberNavController() + + NavHost(navController = navController, startDestination = "bookList") { + composable("bookList") { + BookListScreen() { bookId -> + navController.navigate("bookDetail/$bookId") + } + } + + composable("bookDetail/{bookId}") { backStackEntry -> + val bookId = backStackEntry.arguments?.getString("bookId") + BookDetailScreen(bookId?.toInt() ?: 0) + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 62afee5..0361e6c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,6 +68,7 @@ implementation "androidx.compose.material:material:$composeVersion" implementation "androidx.compose.foundation:foundation-layout:$composeVersion" implementation "androidx.navigation:navigation-compose:2.5.2" + implementation "androidx.hilt:hilt-navigation-compose:1.0.0" // Glide implementation "com.github.bumptech.glide:compose:1.0.0-alpha.1" diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt new file mode 100644 index 0000000..711b54d --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt @@ -0,0 +1,26 @@ +package fr.tf1.player.atelierplayermvvm.ui + +import androidx.compose.runtime.Composable +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailScreen +import fr.tf1.player.atelierplayermvvm.ui.list.BookListScreen + +@Composable +fun BookNavGraph() { + val navController = rememberNavController() + + NavHost(navController = navController, startDestination = "bookList") { + composable("bookList") { + BookListScreen() { bookId -> + navController.navigate("bookDetail/$bookId") + } + } + + composable("bookDetail/{bookId}") { backStackEntry -> + val bookId = backStackEntry.arguments?.getString("bookId") + BookDetailScreen(bookId?.toInt() ?: 0) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt index 83aff17..9168fc7 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt @@ -1,17 +1,21 @@ package fr.tf1.player.atelierplayermvvm.ui.details +import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.State import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.hilt.navigation.compose.hiltViewModel import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage @OptIn(ExperimentalGlideComposeApi::class) @Composable -fun BookDetailScreen(viewModel: BookDetailViewModel) { - Column(modifier = Modifier.fillMaxSize()) { +fun BookDetailScreen(bookId: Int) { + val viewModel = hiltViewModel() + viewModel.fetchBookDetail(bookId) + Column(modifier = Modifier.fillMaxSize().background(Color.White)) { when (val state = viewModel.viewState.value) { is BookDetailContract.State.Loading -> { Text(text = "Loading") diff --git a/app/build.gradle b/app/build.gradle index 62afee5..0361e6c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,6 +68,7 @@ implementation "androidx.compose.material:material:$composeVersion" implementation "androidx.compose.foundation:foundation-layout:$composeVersion" implementation "androidx.navigation:navigation-compose:2.5.2" + implementation "androidx.hilt:hilt-navigation-compose:1.0.0" // Glide implementation "com.github.bumptech.glide:compose:1.0.0-alpha.1" diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt new file mode 100644 index 0000000..711b54d --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt @@ -0,0 +1,26 @@ +package fr.tf1.player.atelierplayermvvm.ui + +import androidx.compose.runtime.Composable +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailScreen +import fr.tf1.player.atelierplayermvvm.ui.list.BookListScreen + +@Composable +fun BookNavGraph() { + val navController = rememberNavController() + + NavHost(navController = navController, startDestination = "bookList") { + composable("bookList") { + BookListScreen() { bookId -> + navController.navigate("bookDetail/$bookId") + } + } + + composable("bookDetail/{bookId}") { backStackEntry -> + val bookId = backStackEntry.arguments?.getString("bookId") + BookDetailScreen(bookId?.toInt() ?: 0) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt index 83aff17..9168fc7 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt @@ -1,17 +1,21 @@ package fr.tf1.player.atelierplayermvvm.ui.details +import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.State import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.hilt.navigation.compose.hiltViewModel import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage @OptIn(ExperimentalGlideComposeApi::class) @Composable -fun BookDetailScreen(viewModel: BookDetailViewModel) { - Column(modifier = Modifier.fillMaxSize()) { +fun BookDetailScreen(bookId: Int) { + val viewModel = hiltViewModel() + viewModel.fetchBookDetail(bookId) + Column(modifier = Modifier.fillMaxSize().background(Color.White)) { when (val state = viewModel.viewState.value) { is BookDetailContract.State.Loading -> { Text(text = "Loading") diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt index 012a228..65ed8de 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt @@ -1,6 +1,5 @@ package fr.tf1.player.atelierplayermvvm.ui.list -import android.content.Intent import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -10,15 +9,15 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext +import androidx.hilt.navigation.compose.hiltViewModel import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach @Composable fun BookListScreen( - viewModel: ListViewModel, onBookClicked: (bookId: String?) -> Unit ) { + val viewModel = hiltViewModel() LaunchedEffect(key1 = "BOOK_LIST_EFFECT_KEY") { viewModel.effect.onEach { sideEffect -> diff --git a/app/build.gradle b/app/build.gradle index 62afee5..0361e6c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,6 +68,7 @@ implementation "androidx.compose.material:material:$composeVersion" implementation "androidx.compose.foundation:foundation-layout:$composeVersion" implementation "androidx.navigation:navigation-compose:2.5.2" + implementation "androidx.hilt:hilt-navigation-compose:1.0.0" // Glide implementation "com.github.bumptech.glide:compose:1.0.0-alpha.1" diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt new file mode 100644 index 0000000..711b54d --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt @@ -0,0 +1,26 @@ +package fr.tf1.player.atelierplayermvvm.ui + +import androidx.compose.runtime.Composable +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailScreen +import fr.tf1.player.atelierplayermvvm.ui.list.BookListScreen + +@Composable +fun BookNavGraph() { + val navController = rememberNavController() + + NavHost(navController = navController, startDestination = "bookList") { + composable("bookList") { + BookListScreen() { bookId -> + navController.navigate("bookDetail/$bookId") + } + } + + composable("bookDetail/{bookId}") { backStackEntry -> + val bookId = backStackEntry.arguments?.getString("bookId") + BookDetailScreen(bookId?.toInt() ?: 0) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt index 83aff17..9168fc7 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt @@ -1,17 +1,21 @@ package fr.tf1.player.atelierplayermvvm.ui.details +import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.State import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.hilt.navigation.compose.hiltViewModel import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage @OptIn(ExperimentalGlideComposeApi::class) @Composable -fun BookDetailScreen(viewModel: BookDetailViewModel) { - Column(modifier = Modifier.fillMaxSize()) { +fun BookDetailScreen(bookId: Int) { + val viewModel = hiltViewModel() + viewModel.fetchBookDetail(bookId) + Column(modifier = Modifier.fillMaxSize().background(Color.White)) { when (val state = viewModel.viewState.value) { is BookDetailContract.State.Loading -> { Text(text = "Loading") diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt index 012a228..65ed8de 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt @@ -1,6 +1,5 @@ package fr.tf1.player.atelierplayermvvm.ui.list -import android.content.Intent import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -10,15 +9,15 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext +import androidx.hilt.navigation.compose.hiltViewModel import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach @Composable fun BookListScreen( - viewModel: ListViewModel, onBookClicked: (bookId: String?) -> Unit ) { + val viewModel = hiltViewModel() LaunchedEffect(key1 = "BOOK_LIST_EFFECT_KEY") { viewModel.effect.onEach { sideEffect -> diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/MainActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/MainActivity.kt index 1395ef7..f9aaeaa 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/MainActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/MainActivity.kt @@ -1,40 +1,23 @@ package fr.tf1.player.atelierplayermvvm.ui.list import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent import androidx.activity.viewModels -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.ui.platform.ComposeView -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.rememberNavController import dagger.hilt.android.AndroidEntryPoint -import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailScreen +import fr.tf1.player.atelierplayermvvm.ui.BookNavGraph import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailViewModel @AndroidEntryPoint -class MainActivity : AppCompatActivity() { +class MainActivity : ComponentActivity() { private val listViewModel: ListViewModel by viewModels() private val detailViewModel: BookDetailViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(ComposeView(this).apply { - setContent { - val navController = rememberNavController() - - NavHost(navController = navController, startDestination = "bookList") { - composable("bookList") { BookListScreen(listViewModel) { bookId -> - navController.navigate("bookDetail/$bookId") - } } - composable("bookDetail/{bookId}") { - bookId -> it.arguments?.getString("bookId") - BookDetailScreen(detailViewModel) - } - } - } - }) - + setContent { + BookNavGraph() + } } - } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 62afee5..0361e6c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,6 +68,7 @@ implementation "androidx.compose.material:material:$composeVersion" implementation "androidx.compose.foundation:foundation-layout:$composeVersion" implementation "androidx.navigation:navigation-compose:2.5.2" + implementation "androidx.hilt:hilt-navigation-compose:1.0.0" // Glide implementation "com.github.bumptech.glide:compose:1.0.0-alpha.1" diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt new file mode 100644 index 0000000..711b54d --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/BookNavGraph.kt @@ -0,0 +1,26 @@ +package fr.tf1.player.atelierplayermvvm.ui + +import androidx.compose.runtime.Composable +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailScreen +import fr.tf1.player.atelierplayermvvm.ui.list.BookListScreen + +@Composable +fun BookNavGraph() { + val navController = rememberNavController() + + NavHost(navController = navController, startDestination = "bookList") { + composable("bookList") { + BookListScreen() { bookId -> + navController.navigate("bookDetail/$bookId") + } + } + + composable("bookDetail/{bookId}") { backStackEntry -> + val bookId = backStackEntry.arguments?.getString("bookId") + BookDetailScreen(bookId?.toInt() ?: 0) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt index 83aff17..9168fc7 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailScreen.kt @@ -1,17 +1,21 @@ package fr.tf1.player.atelierplayermvvm.ui.details +import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.State import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.hilt.navigation.compose.hiltViewModel import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage @OptIn(ExperimentalGlideComposeApi::class) @Composable -fun BookDetailScreen(viewModel: BookDetailViewModel) { - Column(modifier = Modifier.fillMaxSize()) { +fun BookDetailScreen(bookId: Int) { + val viewModel = hiltViewModel() + viewModel.fetchBookDetail(bookId) + Column(modifier = Modifier.fillMaxSize().background(Color.White)) { when (val state = viewModel.viewState.value) { is BookDetailContract.State.Loading -> { Text(text = "Loading") diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt index 012a228..65ed8de 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt @@ -1,6 +1,5 @@ package fr.tf1.player.atelierplayermvvm.ui.list -import android.content.Intent import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -10,15 +9,15 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext +import androidx.hilt.navigation.compose.hiltViewModel import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach @Composable fun BookListScreen( - viewModel: ListViewModel, onBookClicked: (bookId: String?) -> Unit ) { + val viewModel = hiltViewModel() LaunchedEffect(key1 = "BOOK_LIST_EFFECT_KEY") { viewModel.effect.onEach { sideEffect -> diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/MainActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/MainActivity.kt index 1395ef7..f9aaeaa 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/MainActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/MainActivity.kt @@ -1,40 +1,23 @@ package fr.tf1.player.atelierplayermvvm.ui.list import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent import androidx.activity.viewModels -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.ui.platform.ComposeView -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.rememberNavController import dagger.hilt.android.AndroidEntryPoint -import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailScreen +import fr.tf1.player.atelierplayermvvm.ui.BookNavGraph import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailViewModel @AndroidEntryPoint -class MainActivity : AppCompatActivity() { +class MainActivity : ComponentActivity() { private val listViewModel: ListViewModel by viewModels() private val detailViewModel: BookDetailViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(ComposeView(this).apply { - setContent { - val navController = rememberNavController() - - NavHost(navController = navController, startDestination = "bookList") { - composable("bookList") { BookListScreen(listViewModel) { bookId -> - navController.navigate("bookDetail/$bookId") - } } - composable("bookDetail/{bookId}") { - bookId -> it.arguments?.getString("bookId") - BookDetailScreen(detailViewModel) - } - } - } - }) - + setContent { + BookNavGraph() + } } - } \ No newline at end of file diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/navigation/NavHost.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/navigation/NavHost.kt deleted file mode 100644 index bfcde6d..0000000 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/navigation/NavHost.kt +++ /dev/null @@ -1,18 +0,0 @@ -package fr.tf1.player.atelierplayermvvm.ui.navigation - -import androidx.compose.runtime.Composable -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.rememberNavController -import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailScreen -import fr.tf1.player.atelierplayermvvm.ui.list.BookListScreen - -@Composable -fun CreateNavigation() { - val navController = rememberNavController() - - NavHost(navController = navController, startDestination = "booklist") { - composable("booklist") { BookListScreen() } - composable("bookdetail") { BookDetailScreen() } - } -} \ No newline at end of file