diff --git a/app/build.gradle b/app/build.gradle index d53b70e..1ec893a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,11 +4,15 @@ id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } +def composeVersion = '1.2.0-rc02' +def kotlin_version = "1.6.21" android { namespace 'fr.tf1.player.atelierplayermvvm' compileSdk 33 + + defaultConfig { applicationId "fr.tf1.player.atelierplayermvvm" minSdk 23 @@ -33,6 +37,14 @@ jvmTarget = '1.8' } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion "$composeVersion" + kotlinCompilerVersion "$kotlin_version" + } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -50,6 +62,12 @@ implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' +// jetpack compose + implementation "androidx.compose.runtime:runtime:$composeVersion" + implementation "androidx.compose.ui:ui:$composeVersion" + implementation "androidx.compose.material:material:$composeVersion" + implementation "androidx.compose.foundation:foundation-layout:$composeVersion" + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' diff --git a/app/build.gradle b/app/build.gradle index d53b70e..1ec893a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,11 +4,15 @@ id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } +def composeVersion = '1.2.0-rc02' +def kotlin_version = "1.6.21" android { namespace 'fr.tf1.player.atelierplayermvvm' compileSdk 33 + + defaultConfig { applicationId "fr.tf1.player.atelierplayermvvm" minSdk 23 @@ -33,6 +37,14 @@ jvmTarget = '1.8' } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion "$composeVersion" + kotlinCompilerVersion "$kotlin_version" + } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -50,6 +62,12 @@ implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' +// jetpack compose + implementation "androidx.compose.runtime:runtime:$composeVersion" + implementation "androidx.compose.ui:ui:$composeVersion" + implementation "androidx.compose.material:material:$composeVersion" + implementation "androidx.compose.foundation:foundation-layout:$composeVersion" + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt index f6b6960..66086bd 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt @@ -9,7 +9,6 @@ import com.bumptech.glide.Glide import dagger.hilt.android.AndroidEntryPoint import fr.tf1.player.atelierplayermvvm.R -import fr.tf1.player.atelierplayermvvm.ui.list.ListViewModel @AndroidEntryPoint class BookDetailActivity : AppCompatActivity() { diff --git a/app/build.gradle b/app/build.gradle index d53b70e..1ec893a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,11 +4,15 @@ id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } +def composeVersion = '1.2.0-rc02' +def kotlin_version = "1.6.21" android { namespace 'fr.tf1.player.atelierplayermvvm' compileSdk 33 + + defaultConfig { applicationId "fr.tf1.player.atelierplayermvvm" minSdk 23 @@ -33,6 +37,14 @@ jvmTarget = '1.8' } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion "$composeVersion" + kotlinCompilerVersion "$kotlin_version" + } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -50,6 +62,12 @@ implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' +// jetpack compose + implementation "androidx.compose.runtime:runtime:$composeVersion" + implementation "androidx.compose.ui:ui:$composeVersion" + implementation "androidx.compose.material:material:$composeVersion" + implementation "androidx.compose.foundation:foundation-layout:$composeVersion" + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt index f6b6960..66086bd 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt @@ -9,7 +9,6 @@ import com.bumptech.glide.Glide import dagger.hilt.android.AndroidEntryPoint import fr.tf1.player.atelierplayermvvm.R -import fr.tf1.player.atelierplayermvvm.ui.list.ListViewModel @AndroidEntryPoint class BookDetailActivity : AppCompatActivity() { diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt new file mode 100644 index 0000000..f8a219a --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt @@ -0,0 +1,16 @@ +package fr.tf1.player.atelierplayermvvm.ui.list + +import fr.tf1.player.atelierplayermvvm.data.model.Book + +class BookListContract { + + sealed class UIEvent { + data class Click(val bookId: Int) : UIEvent() + } + + sealed class State { + object Loading : State() + data class Error(val msg: String) : State() + data class Completed(val bookList: List) : State() + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index d53b70e..1ec893a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,11 +4,15 @@ id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } +def composeVersion = '1.2.0-rc02' +def kotlin_version = "1.6.21" android { namespace 'fr.tf1.player.atelierplayermvvm' compileSdk 33 + + defaultConfig { applicationId "fr.tf1.player.atelierplayermvvm" minSdk 23 @@ -33,6 +37,14 @@ jvmTarget = '1.8' } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion "$composeVersion" + kotlinCompilerVersion "$kotlin_version" + } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -50,6 +62,12 @@ implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' +// jetpack compose + implementation "androidx.compose.runtime:runtime:$composeVersion" + implementation "androidx.compose.ui:ui:$composeVersion" + implementation "androidx.compose.material:material:$composeVersion" + implementation "androidx.compose.foundation:foundation-layout:$composeVersion" + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt index f6b6960..66086bd 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt @@ -9,7 +9,6 @@ import com.bumptech.glide.Glide import dagger.hilt.android.AndroidEntryPoint import fr.tf1.player.atelierplayermvvm.R -import fr.tf1.player.atelierplayermvvm.ui.list.ListViewModel @AndroidEntryPoint class BookDetailActivity : AppCompatActivity() { diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt new file mode 100644 index 0000000..f8a219a --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt @@ -0,0 +1,16 @@ +package fr.tf1.player.atelierplayermvvm.ui.list + +import fr.tf1.player.atelierplayermvvm.data.model.Book + +class BookListContract { + + sealed class UIEvent { + data class Click(val bookId: Int) : UIEvent() + } + + sealed class State { + object Loading : State() + data class Error(val msg: String) : State() + data class Completed(val bookList: List) : State() + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..efbd78a --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt @@ -0,0 +1,41 @@ +package fr.tf1.player.atelierplayermvvm.ui.list + +import androidx.compose.foundation.background +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.State +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color + +@Composable +fun BookListScreen(viewState: State) { + when (viewState.value) { + is BookListContract.State.Loading -> { +//show loader + Text(text = "Loading") + } + is BookListContract.State.Completed -> { + LazyColumn(modifier = Modifier.background(Color.White)) { + items( + count = (viewState.value as BookListContract.State.Completed).bookList.size, + itemContent = { index -> + Text( + text = (viewState.value as BookListContract.State.Completed).bookList[index].bookName + ?: "" + ) + Text( + text = (viewState.value as BookListContract.State.Completed).bookList[index].bookDesc + ?: "" + ) + }) + } + } + is BookListContract.State.Error -> { + Text(text = "Error") + } + + } + +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index d53b70e..1ec893a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,11 +4,15 @@ id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } +def composeVersion = '1.2.0-rc02' +def kotlin_version = "1.6.21" android { namespace 'fr.tf1.player.atelierplayermvvm' compileSdk 33 + + defaultConfig { applicationId "fr.tf1.player.atelierplayermvvm" minSdk 23 @@ -33,6 +37,14 @@ jvmTarget = '1.8' } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion "$composeVersion" + kotlinCompilerVersion "$kotlin_version" + } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -50,6 +62,12 @@ implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' +// jetpack compose + implementation "androidx.compose.runtime:runtime:$composeVersion" + implementation "androidx.compose.ui:ui:$composeVersion" + implementation "androidx.compose.material:material:$composeVersion" + implementation "androidx.compose.foundation:foundation-layout:$composeVersion" + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt index f6b6960..66086bd 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt @@ -9,7 +9,6 @@ import com.bumptech.glide.Glide import dagger.hilt.android.AndroidEntryPoint import fr.tf1.player.atelierplayermvvm.R -import fr.tf1.player.atelierplayermvvm.ui.list.ListViewModel @AndroidEntryPoint class BookDetailActivity : AppCompatActivity() { diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt new file mode 100644 index 0000000..f8a219a --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt @@ -0,0 +1,16 @@ +package fr.tf1.player.atelierplayermvvm.ui.list + +import fr.tf1.player.atelierplayermvvm.data.model.Book + +class BookListContract { + + sealed class UIEvent { + data class Click(val bookId: Int) : UIEvent() + } + + sealed class State { + object Loading : State() + data class Error(val msg: String) : State() + data class Completed(val bookList: List) : State() + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..efbd78a --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt @@ -0,0 +1,41 @@ +package fr.tf1.player.atelierplayermvvm.ui.list + +import androidx.compose.foundation.background +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.State +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color + +@Composable +fun BookListScreen(viewState: State) { + when (viewState.value) { + is BookListContract.State.Loading -> { +//show loader + Text(text = "Loading") + } + is BookListContract.State.Completed -> { + LazyColumn(modifier = Modifier.background(Color.White)) { + items( + count = (viewState.value as BookListContract.State.Completed).bookList.size, + itemContent = { index -> + Text( + text = (viewState.value as BookListContract.State.Completed).bookList[index].bookName + ?: "" + ) + Text( + text = (viewState.value as BookListContract.State.Completed).bookList[index].bookDesc + ?: "" + ) + }) + } + } + is BookListContract.State.Error -> { + Text(text = "Error") + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt index fab08ec..cc8c724 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt @@ -4,16 +4,15 @@ import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.activity.viewModels +import androidx.compose.ui.platform.ComposeView import androidx.recyclerview.widget.RecyclerView import dagger.hilt.android.AndroidEntryPoint -import fr.tf1.player.atelierplayermvvm.R import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailActivity @AndroidEntryPoint class ListActivity : AppCompatActivity() { private val viewModel: ListViewModel by viewModels() - private lateinit var bookListView: RecyclerView private var bookListAdapter = BookListAdapter { bookId -> val intent = Intent(this@ListActivity, BookDetailActivity::class.java) intent.putExtra("BOOK_ID", bookId) @@ -22,12 +21,9 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_list) - bookListView = findViewById(R.id.booklist) - bookListView.adapter = bookListAdapter - viewModel.books.observe(this) { bookList -> - bookListAdapter.refresh(bookList) - } + setContentView(ComposeView(this).apply { + setContent { BookListScreen(viewModel.viewState) } + }) } diff --git a/app/build.gradle b/app/build.gradle index d53b70e..1ec893a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,11 +4,15 @@ id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } +def composeVersion = '1.2.0-rc02' +def kotlin_version = "1.6.21" android { namespace 'fr.tf1.player.atelierplayermvvm' compileSdk 33 + + defaultConfig { applicationId "fr.tf1.player.atelierplayermvvm" minSdk 23 @@ -33,6 +37,14 @@ jvmTarget = '1.8' } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion "$composeVersion" + kotlinCompilerVersion "$kotlin_version" + } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -50,6 +62,12 @@ implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' +// jetpack compose + implementation "androidx.compose.runtime:runtime:$composeVersion" + implementation "androidx.compose.ui:ui:$composeVersion" + implementation "androidx.compose.material:material:$composeVersion" + implementation "androidx.compose.foundation:foundation-layout:$composeVersion" + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt index f6b6960..66086bd 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt @@ -9,7 +9,6 @@ import com.bumptech.glide.Glide import dagger.hilt.android.AndroidEntryPoint import fr.tf1.player.atelierplayermvvm.R -import fr.tf1.player.atelierplayermvvm.ui.list.ListViewModel @AndroidEntryPoint class BookDetailActivity : AppCompatActivity() { diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt new file mode 100644 index 0000000..f8a219a --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt @@ -0,0 +1,16 @@ +package fr.tf1.player.atelierplayermvvm.ui.list + +import fr.tf1.player.atelierplayermvvm.data.model.Book + +class BookListContract { + + sealed class UIEvent { + data class Click(val bookId: Int) : UIEvent() + } + + sealed class State { + object Loading : State() + data class Error(val msg: String) : State() + data class Completed(val bookList: List) : State() + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..efbd78a --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt @@ -0,0 +1,41 @@ +package fr.tf1.player.atelierplayermvvm.ui.list + +import androidx.compose.foundation.background +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.State +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color + +@Composable +fun BookListScreen(viewState: State) { + when (viewState.value) { + is BookListContract.State.Loading -> { +//show loader + Text(text = "Loading") + } + is BookListContract.State.Completed -> { + LazyColumn(modifier = Modifier.background(Color.White)) { + items( + count = (viewState.value as BookListContract.State.Completed).bookList.size, + itemContent = { index -> + Text( + text = (viewState.value as BookListContract.State.Completed).bookList[index].bookName + ?: "" + ) + Text( + text = (viewState.value as BookListContract.State.Completed).bookList[index].bookDesc + ?: "" + ) + }) + } + } + is BookListContract.State.Error -> { + Text(text = "Error") + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt index fab08ec..cc8c724 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt @@ -4,16 +4,15 @@ import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.activity.viewModels +import androidx.compose.ui.platform.ComposeView import androidx.recyclerview.widget.RecyclerView import dagger.hilt.android.AndroidEntryPoint -import fr.tf1.player.atelierplayermvvm.R import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailActivity @AndroidEntryPoint class ListActivity : AppCompatActivity() { private val viewModel: ListViewModel by viewModels() - private lateinit var bookListView: RecyclerView private var bookListAdapter = BookListAdapter { bookId -> val intent = Intent(this@ListActivity, BookDetailActivity::class.java) intent.putExtra("BOOK_ID", bookId) @@ -22,12 +21,9 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_list) - bookListView = findViewById(R.id.booklist) - bookListView.adapter = bookListAdapter - viewModel.books.observe(this) { bookList -> - bookListAdapter.refresh(bookList) - } + setContentView(ComposeView(this).apply { + setContent { BookListScreen(viewModel.viewState) } + }) } diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListViewModel.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListViewModel.kt index d32da0d..1fdf7b8 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListViewModel.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListViewModel.kt @@ -1,5 +1,8 @@ package fr.tf1.player.atelierplayermvvm.ui.list +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -12,16 +15,19 @@ @HiltViewModel class ListViewModel @Inject constructor(val fetchListUseCase: FetchListUseCase) : ViewModel() { - val books: MutableLiveData> + private val initialState: BookListContract.State = BookListContract.State.Loading + + private val _viewState: MutableState = mutableStateOf(initialState) + var viewState: State = _viewState init { - books = MutableLiveData>() fetchList() } fun fetchList() { viewModelScope.launch { - books.value = fetchListUseCase.fetchList() + val bookList = fetchListUseCase.fetchList() + _viewState.value = BookListContract.State.Completed(bookList) } } diff --git a/app/build.gradle b/app/build.gradle index d53b70e..1ec893a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,11 +4,15 @@ id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } +def composeVersion = '1.2.0-rc02' +def kotlin_version = "1.6.21" android { namespace 'fr.tf1.player.atelierplayermvvm' compileSdk 33 + + defaultConfig { applicationId "fr.tf1.player.atelierplayermvvm" minSdk 23 @@ -33,6 +37,14 @@ jvmTarget = '1.8' } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion "$composeVersion" + kotlinCompilerVersion "$kotlin_version" + } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -50,6 +62,12 @@ implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' +// jetpack compose + implementation "androidx.compose.runtime:runtime:$composeVersion" + implementation "androidx.compose.ui:ui:$composeVersion" + implementation "androidx.compose.material:material:$composeVersion" + implementation "androidx.compose.foundation:foundation-layout:$composeVersion" + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt index f6b6960..66086bd 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/details/BookDetailActivity.kt @@ -9,7 +9,6 @@ import com.bumptech.glide.Glide import dagger.hilt.android.AndroidEntryPoint import fr.tf1.player.atelierplayermvvm.R -import fr.tf1.player.atelierplayermvvm.ui.list.ListViewModel @AndroidEntryPoint class BookDetailActivity : AppCompatActivity() { diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt new file mode 100644 index 0000000..f8a219a --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListContract.kt @@ -0,0 +1,16 @@ +package fr.tf1.player.atelierplayermvvm.ui.list + +import fr.tf1.player.atelierplayermvvm.data.model.Book + +class BookListContract { + + sealed class UIEvent { + data class Click(val bookId: Int) : UIEvent() + } + + sealed class State { + object Loading : State() + data class Error(val msg: String) : State() + data class Completed(val bookList: List) : State() + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..efbd78a --- /dev/null +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/BookListScreen.kt @@ -0,0 +1,41 @@ +package fr.tf1.player.atelierplayermvvm.ui.list + +import androidx.compose.foundation.background +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.State +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color + +@Composable +fun BookListScreen(viewState: State) { + when (viewState.value) { + is BookListContract.State.Loading -> { +//show loader + Text(text = "Loading") + } + is BookListContract.State.Completed -> { + LazyColumn(modifier = Modifier.background(Color.White)) { + items( + count = (viewState.value as BookListContract.State.Completed).bookList.size, + itemContent = { index -> + Text( + text = (viewState.value as BookListContract.State.Completed).bookList[index].bookName + ?: "" + ) + Text( + text = (viewState.value as BookListContract.State.Completed).bookList[index].bookDesc + ?: "" + ) + }) + } + } + is BookListContract.State.Error -> { + Text(text = "Error") + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt index fab08ec..cc8c724 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListActivity.kt @@ -4,16 +4,15 @@ import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.activity.viewModels +import androidx.compose.ui.platform.ComposeView import androidx.recyclerview.widget.RecyclerView import dagger.hilt.android.AndroidEntryPoint -import fr.tf1.player.atelierplayermvvm.R import fr.tf1.player.atelierplayermvvm.ui.details.BookDetailActivity @AndroidEntryPoint class ListActivity : AppCompatActivity() { private val viewModel: ListViewModel by viewModels() - private lateinit var bookListView: RecyclerView private var bookListAdapter = BookListAdapter { bookId -> val intent = Intent(this@ListActivity, BookDetailActivity::class.java) intent.putExtra("BOOK_ID", bookId) @@ -22,12 +21,9 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_list) - bookListView = findViewById(R.id.booklist) - bookListView.adapter = bookListAdapter - viewModel.books.observe(this) { bookList -> - bookListAdapter.refresh(bookList) - } + setContentView(ComposeView(this).apply { + setContent { BookListScreen(viewModel.viewState) } + }) } diff --git a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListViewModel.kt b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListViewModel.kt index d32da0d..1fdf7b8 100644 --- a/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListViewModel.kt +++ b/app/src/main/java/fr/tf1/player/atelierplayermvvm/ui/list/ListViewModel.kt @@ -1,5 +1,8 @@ package fr.tf1.player.atelierplayermvvm.ui.list +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -12,16 +15,19 @@ @HiltViewModel class ListViewModel @Inject constructor(val fetchListUseCase: FetchListUseCase) : ViewModel() { - val books: MutableLiveData> + private val initialState: BookListContract.State = BookListContract.State.Loading + + private val _viewState: MutableState = mutableStateOf(initialState) + var viewState: State = _viewState init { - books = MutableLiveData>() fetchList() } fun fetchList() { viewModelScope.launch { - books.value = fetchListUseCase.fetchList() + val bookList = fetchListUseCase.fetchList() + _viewState.value = BookListContract.State.Completed(bookList) } } diff --git a/build.gradle b/build.gradle index 23e6fc8..9b2fbcf 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,6 @@ plugins { id 'com.android.application' version '7.3.1' apply false id 'com.android.library' version '7.3.1' apply false - id 'org.jetbrains.kotlin.android' version '1.7.20' apply false + id 'org.jetbrains.kotlin.android' version '1.6.21' apply false id 'com.google.dagger.hilt.android' version '2.44' apply false } \ No newline at end of file