From 6aca43bc5f31ebe59245d7ba55c6e5c17ee9268c Mon Sep 17 00:00:00 2001 From: Thomas Andres Gomez Date: Mon, 4 Jul 2022 16:51:17 +0200 Subject: [PATCH] Fix somes loading bugs. introduce Glide. --- app/build.gradle | 3 + app/src/main/AndroidManifest.xml | 1 + .../com/pixelized/biblib/BibLibApplication.kt | 12 ++- .../biblib/module/PersistenceModule.kt | 22 ------ .../com/pixelized/biblib/ui/MainActivity.kt | 12 +-- .../pixelized/biblib/ui/composable/Picture.kt | 21 ------ .../pixelized/biblib/ui/composable/Search.kt | 42 +++++++---- .../biblib/ui/composable/SystemThemeColor.kt | 39 ++++++---- .../composable/animation/AnimatedDelayer.kt | 6 +- .../biblib/ui/scaffold/SearchScaffold.kt | 12 +-- .../authentication/AuthenticationScreen.kt | 6 +- .../ui/screen/detail/BookDetailViewModel.kt | 33 +-------- .../biblib/ui/screen/detail/DetailScreen.kt | 44 ++++------- .../biblib/ui/screen/home/HomeScreen.kt | 13 ++-- .../biblib/ui/screen/home/HomeViewModel.kt | 40 +--------- .../common/composable/bookPreviewResources.kt | 25 ++----- .../home/common/uio/BookThumbnailUio.kt | 4 +- .../ui/screen/home/common/uio/BookUio.kt | 9 +-- .../ui/screen/home/common/uio/CoverUio.kt | 22 ------ .../home/common/viewModel/ACoverViewModel.kt | 39 ---------- .../screen/home/page/books/BookThumbnail.kt | 55 ++++---------- .../ui/screen/home/page/books/BooksPage.kt | 8 +- .../screen/home/page/books/BooksViewModel.kt | 28 ++----- .../ui/screen/home/page/news/NewThumbnail.kt | 48 ++---------- .../home/page/news/NewsBookViewModel.kt | 36 ++------- .../ui/screen/home/page/news/NewsPage.kt | 22 +++--- .../biblib/ui/screen/profile/ProfileScreen.kt | 20 ++++- .../ui/screen/profile/ProfileViewModel.kt | 8 +- .../biblib/ui/theme/dimen/BibLibDimen.kt | 2 +- .../biblib/utils/cache/BookCoverCache.kt | 74 ------------------- .../biblib/utils/cache/ImageCache.kt | 37 ---------- .../biblib/utils/extention/ContextEx.kt | 2 +- .../pixelized/biblib/utils/extention/LogEx.kt | 5 -- .../biblib/utils/extention/WindowInsetsEx.kt | 11 +++ app/src/main/res/drawable/ic_google.xml | 23 ++++-- 35 files changed, 219 insertions(+), 565 deletions(-) delete mode 100644 app/src/main/java/com/pixelized/biblib/ui/composable/Picture.kt delete mode 100644 app/src/main/java/com/pixelized/biblib/ui/screen/home/common/uio/CoverUio.kt delete mode 100644 app/src/main/java/com/pixelized/biblib/ui/screen/home/common/viewModel/ACoverViewModel.kt delete mode 100644 app/src/main/java/com/pixelized/biblib/utils/cache/BookCoverCache.kt delete mode 100644 app/src/main/java/com/pixelized/biblib/utils/cache/ImageCache.kt delete mode 100644 app/src/main/java/com/pixelized/biblib/utils/extention/LogEx.kt create mode 100644 app/src/main/java/com/pixelized/biblib/utils/extention/WindowInsetsEx.kt diff --git a/app/build.gradle b/app/build.gradle index 0f8c0ff..851a122 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -114,6 +114,9 @@ dependencies { implementation "com.google.accompanist:accompanist-pager:0.24.7-alpha" implementation "com.google.accompanist:accompanist-pager-indicators:0.24.7-alpha" + // Landscapist + implementation "com.github.skydoves:landscapist-glide:1.5.2" + // Navigation implementation "androidx.navigation:navigation-compose:2.4.2" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f524502..273fa4b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,6 +18,7 @@ diff --git a/app/src/main/java/com/pixelized/biblib/BibLibApplication.kt b/app/src/main/java/com/pixelized/biblib/BibLibApplication.kt index 788757d..b08d1e2 100644 --- a/app/src/main/java/com/pixelized/biblib/BibLibApplication.kt +++ b/app/src/main/java/com/pixelized/biblib/BibLibApplication.kt @@ -1,7 +1,17 @@ package com.pixelized.biblib import android.app.Application +import android.os.StrictMode import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp -class BibLibApplication : Application() \ No newline at end of file +class BibLibApplication : Application() { + + override fun onCreate() { + super.onCreate() + + if (BuildConfig.DEBUG) { + StrictMode.enableDefaults() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/module/PersistenceModule.kt b/app/src/main/java/com/pixelized/biblib/module/PersistenceModule.kt index 78dd282..855da5b 100644 --- a/app/src/main/java/com/pixelized/biblib/module/PersistenceModule.kt +++ b/app/src/main/java/com/pixelized/biblib/module/PersistenceModule.kt @@ -4,8 +4,6 @@ import android.content.Context import android.content.SharedPreferences import androidx.room.Room import com.pixelized.biblib.database.BibLibDatabase -import com.pixelized.biblib.utils.cache.BookCoverCache -import com.pixelized.biblib.utils.cache.ImageCache import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -30,26 +28,6 @@ class PersistenceModule { return builder.fallbackToDestructiveMigration().build() } - @Provides - @Singleton - fun provideBookCoverCache( - imageCache: ImageCache, - ): BookCoverCache { - return BookCoverCache( - cache = imageCache - ) - } - - @Provides - @Singleton - fun provideImageCache( - @ApplicationContext context: Context, - ): ImageCache { - return ImageCache( - context = context - ) - } - @Provides @Singleton fun providePreferences( diff --git a/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt b/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt index c86a8e5..636b2fa 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt @@ -7,9 +7,9 @@ import androidx.activity.viewModels import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface +import androidx.compose.ui.graphics.Color import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.WindowCompat -import com.google.accompanist.insets.ProvideWindowInsets import com.google.accompanist.systemuicontroller.SystemUiController import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.pixelized.biblib.ui.composable.SystemThemeColor @@ -40,16 +40,8 @@ class MainActivity : ComponentActivity() { // Compose setContent { BibLibTheme { - ProvideWindowInsets { + SystemThemeColor { Surface(color = MaterialTheme.colors.background) { - // Handle the system colors - val systemUiController: SystemUiController = rememberSystemUiController() - SystemThemeColor( - systemUiController = systemUiController, - statusDarkIcons = isSystemInDarkTheme().not(), - navigationDarkIcons = isSystemInDarkTheme().not(), - ) - // Handle the main Navigation if (launcherViewModel.isLoading.not()) { ScreenNavHost( diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/Picture.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/Picture.kt deleted file mode 100644 index ab34f37..0000000 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/Picture.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.pixelized.biblib.ui.composable - -import androidx.compose.foundation.Image -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import com.pixelized.biblib.ui.screen.home.common.uio.CoverUio - -@Composable -fun Cover( - modifier: Modifier = Modifier, - cover: CoverUio, - contentDescription: String? = null, -) { - Image( - modifier = modifier, - painter = cover.painter, - contentScale = cover.contentScale, - colorFilter = cover.colorFilter, - contentDescription = contentDescription, - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/Search.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/Search.kt index 371db5b..3032ac6 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/Search.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/Search.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -26,16 +27,17 @@ import com.pixelized.biblib.ui.scaffold.SearchScaffoldState import com.pixelized.biblib.ui.scaffold.rememberSearchScaffoldState import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.utils.extention.bibLib -import com.pixelized.biblib.utils.extention.todo +import com.pixelized.biblib.utils.extention.default +import com.skydoves.landscapist.glide.GlideImage @Composable fun Search( modifier: Modifier = Modifier, state: SearchScaffoldState = rememberSearchScaffoldState(), - avatar: Painter, - onAvatar: () -> Unit = todo(), - onSearch: () -> Unit = todo(), + avatar: String?, + onAvatar: () -> Unit = default(), + onSearch: () -> Unit = default(), ) { val horizontalPadding by animateDpAsState( targetValue = when (state.isCollapsed()) { @@ -77,24 +79,36 @@ fun Search( ), onValueChange = { search = it } ) - IconButton( - modifier = Modifier.padding(end = horizontalPadding), - onClick = onAvatar, - ) { - Image( - modifier = Modifier.clip(CircleShape), - painter = avatar, - contentDescription = null - ) + avatar?.let { + IconButton( + modifier = Modifier.padding(end = horizontalPadding), + onClick = onAvatar, + ) { + GlideImage( + modifier = Modifier.clip(CircleShape).size(32.dp), + previewPlaceholder = R.drawable.ic_google, + contentScale = ContentScale.Fit, + imageModel = it, + ) + } } } } +@Composable +@Preview(showBackground = true, uiMode = UI_MODE_NIGHT_NO) +@Preview(showBackground = true, uiMode = UI_MODE_NIGHT_YES) +private fun SearchContentEmptyPreview() { + BibLibTheme { + Search(avatar = null) + } +} + @Composable @Preview(showBackground = true, uiMode = UI_MODE_NIGHT_NO) @Preview(showBackground = true, uiMode = UI_MODE_NIGHT_YES) private fun SearchContentPreview() { BibLibTheme { - Search(avatar = painterResource(R.drawable.ic_google)) + Search(avatar = "") } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/SystemThemeColor.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/SystemThemeColor.kt index 9d542b4..dadcc06 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/SystemThemeColor.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/SystemThemeColor.kt @@ -1,24 +1,35 @@ package com.pixelized.biblib.ui.composable import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.SideEffect +import androidx.compose.runtime.compositionLocalOf import androidx.compose.ui.graphics.Color import com.google.accompanist.systemuicontroller.SystemUiController +import com.google.accompanist.systemuicontroller.rememberSystemUiController + +val LocalSystemUiController = compositionLocalOf { error("") } @Composable fun SystemThemeColor( - systemUiController: SystemUiController, - color: Color = Color.Transparent, - statusDarkIcons: Boolean, - navigationDarkIcons: Boolean, -) = SideEffect { - systemUiController.setStatusBarColor( - color = color, - darkIcons = statusDarkIcons, - ) - systemUiController.setNavigationBarColor( - color = color, - darkIcons = navigationDarkIcons, - navigationBarContrastEnforced = false, - ) + systemUiController: SystemUiController = rememberSystemUiController(), + color: Color = Color.Black.copy(alpha = 0.3f), + statusDarkIcons: Boolean = false, + navigationDarkIcons: Boolean = false, + content: @Composable () -> Unit, +) { + CompositionLocalProvider(LocalSystemUiController provides systemUiController) { + SideEffect { + systemUiController.setStatusBarColor( + color = color, + darkIcons = statusDarkIcons, + ) + systemUiController.setNavigationBarColor( + color = color, + darkIcons = navigationDarkIcons, + navigationBarContrastEnforced = false, + ) + } + content() + } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/animation/AnimatedDelayer.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/animation/AnimatedDelayer.kt index 8c8dafe..42bd967 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/animation/AnimatedDelayer.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/animation/AnimatedDelayer.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.Composable @Composable fun AnimatedDelayer( - delay: Int = 0, + delay: Int = Delay.DELTA, content: @Composable AnimatedDelayerScope.() -> Unit ) { val scope = AnimatedDelayerScope( @@ -18,7 +18,7 @@ fun AnimatedDelayer( @Composable fun AnimatedDelayer( targetState: T, - delay: Int = 0, + delay: Int = Delay.DELTA, content: @Composable AnimatedDelayerScope.(T) -> Unit ) { AnimatedContent( @@ -46,6 +46,6 @@ value class Delay( } companion object { - private const val DELTA = 100 + const val DELTA = 100 } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/scaffold/SearchScaffold.kt b/app/src/main/java/com/pixelized/biblib/ui/scaffold/SearchScaffold.kt index d05b462..e44286c 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/scaffold/SearchScaffold.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/scaffold/SearchScaffold.kt @@ -24,7 +24,7 @@ fun SearchScaffold( search: @Composable () -> Unit, content: @Composable () -> Unit, ) { - var initialHeight by remember { mutableStateOf(0) } + var initialCardBoxHeight by remember { mutableStateOf(0) } Layout( modifier = modifier, content = { @@ -68,13 +68,15 @@ fun SearchScaffold( } ) { measurables, constraints -> val cardBox = measurables.first { it.layoutId == "cardBox" }.measure(constraints) - val contentBox = measurables.first { it.layoutId == "contentBox" }.measure(constraints) + val contentBox = measurables.first { it.layoutId == "contentBox" }.measure(constraints.copy( + maxHeight = constraints.maxHeight - initialCardBoxHeight + )) layout(constraints.maxWidth, constraints.maxHeight) { - if (initialHeight == 0) { - initialHeight = cardBox.measuredHeight + if (initialCardBoxHeight == 0) { + initialCardBoxHeight = cardBox.measuredHeight } - contentBox.place(x = 0, y = initialHeight) + contentBox.place(x = 0, y = initialCardBoxHeight) cardBox.place(x = 0, y = 0) } } diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/authentication/AuthenticationScreen.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/authentication/AuthenticationScreen.kt index 173f8f3..d12cd7d 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/authentication/AuthenticationScreen.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/authentication/AuthenticationScreen.kt @@ -29,7 +29,6 @@ import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavHostController -import com.google.accompanist.insets.systemBarsPadding import com.pixelized.biblib.R import com.pixelized.biblib.network.client.IBibLibClient import com.pixelized.biblib.ui.composable.StateUio @@ -52,6 +51,7 @@ fun AuthenticationScreen( val navHostController = LocalScreenNavHostController.current AuthenticationScreenContent( + modifier = Modifier.systemBarsPadding(), login = formViewModel.form.login, password = formViewModel.form.password, rememberPassword = formViewModel.form.remember, @@ -90,6 +90,7 @@ fun AuthenticationScreen( @Composable private fun AuthenticationScreenContent( + modifier: Modifier = Modifier, login: String, onLoginChange: (String) -> Unit, password: String, @@ -105,10 +106,9 @@ private fun AuthenticationScreenContent( AnimatedDelayer { Column( - modifier = Modifier + modifier = modifier .fillMaxSize() .verticalScroll(scrollState) - .systemBarsPadding() ) { Spacer(modifier = Modifier.weight(1f)) diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/detail/BookDetailViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/detail/BookDetailViewModel.kt index 46a4a74..7265483 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/detail/BookDetailViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/detail/BookDetailViewModel.kt @@ -1,34 +1,23 @@ package com.pixelized.biblib.ui.screen.detail -import android.app.Application import android.util.Log -import androidx.compose.runtime.getValue -import androidx.compose.ui.layout.ContentScale -import com.pixelized.biblib.R +import androidx.lifecycle.ViewModel import com.pixelized.biblib.model.book.Book import com.pixelized.biblib.network.client.IBibLibClient import com.pixelized.biblib.network.factory.BookFactory import com.pixelized.biblib.ui.composable.StateUio import com.pixelized.biblib.ui.screen.home.common.uio.BookUio -import com.pixelized.biblib.ui.screen.home.common.uio.CoverUio -import com.pixelized.biblib.ui.screen.home.common.viewModel.ACoverViewModel -import com.pixelized.biblib.utils.cache.BookCoverCache import com.pixelized.biblib.utils.extention.capitalize -import com.pixelized.biblib.utils.extention.context import com.pixelized.biblib.utils.extention.shortDate -import com.pixelized.biblib.utils.painterResource import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import java.net.URL import javax.inject.Inject @HiltViewModel class BookDetailViewModel @Inject constructor( - application: Application, - bookCoverCache: BookCoverCache, private val client: IBibLibClient, -) : ACoverViewModel(application, bookCoverCache) { +) : ViewModel() { suspend fun getDetail(id: Int): StateUio { return withContext(Dispatchers.IO) { @@ -50,16 +39,7 @@ class BookDetailViewModel @Inject constructor( } private fun Book.toUio(): BookUio { - val thumbnailCover by cover( - placeHolder = CoverUio( - type = CoverUio.Type.PLACE_HOLDER, - contentScale = ContentScale.FillBounds, - painter = painterResource(context, R.drawable.ic_baseline_auto_stories_24), - ), - type = CoverUio.Type.THUMBNAIL, - contentScale = ContentScale.FillHeight, - url = URL("${IBibLibClient.THUMBNAIL_URL}/$id.jpg"), - ) + return BookUio( id = id, title = title, @@ -69,12 +49,7 @@ class BookDetailViewModel @Inject constructor( date = releaseDate.shortDate(), series = series?.name, description = synopsis ?: "", - coverState = cover( - placeHolder = thumbnailCover, - type = CoverUio.Type.DETAIL, - contentScale = ContentScale.FillHeight, - url = URL("${IBibLibClient.COVER_URL}/$id.jpg"), - ) + cover = "${IBibLibClient.COVER_URL}/$id.jpg", ) } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/detail/DetailScreen.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/detail/DetailScreen.kt index d6416b3..2792b80 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/detail/DetailScreen.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/detail/DetailScreen.kt @@ -18,7 +18,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign @@ -28,7 +27,6 @@ import androidx.core.text.HtmlCompat import androidx.core.text.toSpannable import androidx.hilt.navigation.compose.hiltViewModel import com.pixelized.biblib.R -import com.pixelized.biblib.ui.composable.Cover import com.pixelized.biblib.ui.composable.SpannedText import com.pixelized.biblib.ui.composable.StateUio import com.pixelized.biblib.ui.composable.animation.AnimatedDelayer @@ -37,12 +35,13 @@ import com.pixelized.biblib.ui.composable.isSuccessful import com.pixelized.biblib.ui.scaffold.BottomDetailState import com.pixelized.biblib.ui.scaffold.LocalBottomDetailState import com.pixelized.biblib.ui.screen.home.common.uio.BookUio -import com.pixelized.biblib.ui.screen.home.common.uio.CoverUio import com.pixelized.biblib.ui.screen.profile.ProfileViewModel import com.pixelized.biblib.ui.screen.profile.UserUio import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.utils.extention.bibLib -import com.pixelized.biblib.utils.extention.todo +import com.pixelized.biblib.utils.extention.default +import com.skydoves.landscapist.CircularReveal +import com.skydoves.landscapist.glide.GlideImage import kotlinx.coroutines.launch @OptIn(ExperimentalMaterialApi::class) @@ -103,9 +102,9 @@ fun DetailScreen( private fun DetailScreenContent( modifier: Modifier = Modifier, book: BookUio, - onMobi: () -> Unit = todo(), - onEpub: () -> Unit = todo(), - onSend: () -> Unit = todo(), + onMobi: () -> Unit = default(), + onEpub: () -> Unit = default(), + onSend: () -> Unit = default(), ) { AnimatedDelayer( targetState = book, @@ -117,23 +116,16 @@ private fun DetailScreenContent( .padding(all = MaterialTheme.bibLib.dimen.dp16) .then(modifier) ) { - AnimatedOffset( + GlideImage( modifier = Modifier .fillMaxWidth() .padding(vertical = MaterialTheme.bibLib.dimen.dp16) .height(MaterialTheme.bibLib.dimen.detail.cover), - contentAlignment = Alignment.Center - ) { - val sizeModifier = if (book.cover.type == CoverUio.Type.PLACE_HOLDER) { - Modifier.size(MaterialTheme.bibLib.dimen.detail.placeHolder) - } else { - Modifier.fillMaxSize() - } - Cover( - modifier = sizeModifier, - cover = book.cover, - ) - } + previewPlaceholder = R.drawable.ic_launcher_foreground, + circularReveal = CircularReveal(duration = 1000), + contentScale = ContentScale.FillHeight, + imageModel = book.cover, + ) Row(modifier = Modifier.padding(vertical = MaterialTheme.bibLib.dimen.dp16)) { AnimatedOffset( @@ -318,16 +310,6 @@ private fun DetailScreenSendContent( @Preview(showBackground = true, uiMode = UI_MODE_NIGHT_NO) @Preview(showBackground = true, uiMode = UI_MODE_NIGHT_YES) private fun DetailScreenContentPreview() { - val painter = painterResource(id = R.drawable.ic_baseline_auto_stories_24) - val cover = remember { - mutableStateOf( - CoverUio( - type = CoverUio.Type.PLACE_HOLDER, - contentScale = ContentScale.FillBounds, - painter = painter, - ) - ) - } val book = BookUio( id = 90, title = "Foundation", @@ -337,7 +319,7 @@ private fun DetailScreenContentPreview() { description = "En ce début de treizième millénaire, l'Empire n'a jamais été aussi puissant, aussi étendu à travers toute la galaxie. C'est dans sa capitale, Trantor, que l'éminent savant Hari Seldon invente la psychohistoire, une science nouvelle permettant de prédire l'avenir. Grâce à elle, Seldon prévoit l'effondrement de l'Empire d'ici cinq siècles, suivi d'une ère de ténèbres de trente mille ans. Réduire cette période à mille ans est peut-être possible, à condition de mener à terme son projet : la Fondation, chargée de rassembler toutes les connaissances humaines. Une entreprise visionnaire qui rencontre de nombreux et puissants détracteurs...", rating = 4.5f, language = "Français", - coverState = cover, + cover = "", ) BibLibTheme { DetailScreenContent(book = book) diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeScreen.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeScreen.kt index e650f74..d48a113 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeScreen.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeScreen.kt @@ -44,10 +44,8 @@ fun HomeScreen( BottomDetailScaffold { SearchScaffold( + modifier = Modifier.statusBarsPadding(), state = searchScaffoldState, - modifier = Modifier - .systemBarsPadding() - .clipToBounds(), topBar = { Search( state = searchScaffoldState, @@ -98,7 +96,7 @@ fun HomeScreenContent( val scope: CoroutineScope = rememberCoroutineScope() val pagerState: PagerState = rememberPagerState() - Column(modifier = Modifier.navigationBarsPadding()) { + Column { ScrollableTabRow( selectedTabIndex = pagerState.currentPage, edgePadding = MaterialTheme.bibLib.dimen.dp16, @@ -112,15 +110,16 @@ fun HomeScreenContent( } } HorizontalPager( + modifier = Modifier.fillMaxSize(), state = pagerState, count = pages.size ) { when (pages[it]) { is Page.News -> NewsPage() is Page.Books -> BooksPage() - is Page.Author -> Box(modifier = Modifier.fillMaxSize()) - is Page.Series -> Box(modifier = Modifier.fillMaxSize()) - is Page.Tag -> Box(modifier = Modifier.fillMaxSize()) + is Page.Author -> Box(modifier = Modifier) + is Page.Series -> Box(modifier = Modifier) + is Page.Tag -> Box(modifier = Modifier) } } } diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeViewModel.kt index 33dcbc4..66ce591 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeViewModel.kt @@ -1,47 +1,15 @@ package com.pixelized.biblib.ui.screen.home -import android.app.Application import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf -import androidx.compose.ui.layout.ContentScale -import com.pixelized.biblib.R +import androidx.lifecycle.ViewModel import com.pixelized.biblib.repository.googleSignIn.IGoogleSingInRepository -import com.pixelized.biblib.ui.screen.home.common.uio.CoverUio -import com.pixelized.biblib.ui.screen.home.common.viewModel.ACoverViewModel -import com.pixelized.biblib.utils.cache.BookCoverCache -import com.pixelized.biblib.utils.extention.context -import com.pixelized.biblib.utils.painterResource import dagger.hilt.android.lifecycle.HiltViewModel -import java.net.URL import javax.inject.Inject @HiltViewModel class HomeViewModel @Inject constructor( - application: Application, - cacheBook: BookCoverCache, - private val account: IGoogleSingInRepository, -) : ACoverViewModel(application, cacheBook) { - - private val _avatar = mutableStateOf( - painterResource(context, R.drawable.ic_launcher_foreground) - ) - val avatar by _avatar - - init { - updateAvatar() - } - - private fun updateAvatar() { - account.account?.photoUrl?.let { - _avatar.value = cover( - placeHolder = CoverUio( - type = CoverUio.Type.PLACE_HOLDER, - painter = painterResource(context, R.drawable.ic_launcher_foreground), - ), - type = CoverUio.Type.DETAIL, - contentScale = ContentScale.None, - url = URL("$it"), - ).value.painter - } - } + account: IGoogleSingInRepository, +) : ViewModel() { + val avatar by mutableStateOf(account.account?.photoUrl?.toString()) } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/composable/bookPreviewResources.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/composable/bookPreviewResources.kt index 9198e19..833145a 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/composable/bookPreviewResources.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/composable/bookPreviewResources.kt @@ -1,26 +1,15 @@ package com.pixelized.biblib.ui.screen.home.common.composable import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.res.painterResource import androidx.paging.PagingData import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems -import com.pixelized.biblib.R import com.pixelized.biblib.ui.screen.home.common.uio.BookThumbnailUio -import com.pixelized.biblib.ui.screen.home.common.uio.CoverUio import kotlinx.coroutines.flow.flowOf @Composable fun bookPreviewResources(): LazyPagingItems { - val cover = CoverUio( - type = CoverUio.Type.PLACE_HOLDER, - painter = painterResource(id = R.drawable.ic_baseline_auto_stories_24), - contentScale = ContentScale.None, - ) val thumbnails = listOf( BookThumbnailUio( id = 112, @@ -29,7 +18,7 @@ fun bookPreviewResources(): LazyPagingItems { date = "1988", genre = "Sci-Fi", isNew = false, - cover = remember { mutableStateOf(cover) }, + cover = "", ), BookThumbnailUio( id = 78, @@ -38,7 +27,7 @@ fun bookPreviewResources(): LazyPagingItems { date = "1993", genre = "Sci-Fi", isNew = false, - cover = remember { mutableStateOf(cover) }, + cover = "", ), BookThumbnailUio( id = 90, @@ -47,7 +36,7 @@ fun bookPreviewResources(): LazyPagingItems { date = "1951", genre = "Sci-Fi", isNew = false, - cover = remember { mutableStateOf(cover) }, + cover = "", ), BookThumbnailUio( id = 184, @@ -56,7 +45,7 @@ fun bookPreviewResources(): LazyPagingItems { date = "1952", genre = "Sci-Fi", isNew = false, - cover = remember { mutableStateOf(cover) }, + cover = "", ), BookThumbnailUio( id = 185, @@ -65,7 +54,7 @@ fun bookPreviewResources(): LazyPagingItems { date = "1953", genre = "Sci-Fi", isNew = false, - cover = remember { mutableStateOf(cover) }, + cover = "", ), BookThumbnailUio( id = 119, @@ -74,7 +63,7 @@ fun bookPreviewResources(): LazyPagingItems { date = "1982", genre = "Sci-Fi", isNew = false, - cover = remember { mutableStateOf(cover) }, + cover = "", ), BookThumbnailUio( id = 163, @@ -83,7 +72,7 @@ fun bookPreviewResources(): LazyPagingItems { date = "1986", genre = "Sci-Fi", isNew = false, - cover = remember { mutableStateOf(cover) }, + cover = "", ), ) return flowOf(PagingData.from(thumbnails)).collectAsLazyPagingItems() diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/uio/BookThumbnailUio.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/uio/BookThumbnailUio.kt index 5e9f1b3..c3b651f 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/uio/BookThumbnailUio.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/uio/BookThumbnailUio.kt @@ -1,7 +1,5 @@ package com.pixelized.biblib.ui.screen.home.common.uio -import androidx.compose.runtime.State - class BookThumbnailUio( val id: Int, val genre: String, @@ -9,5 +7,5 @@ class BookThumbnailUio( val author: String, val date: String?, val isNew: Boolean, - val cover: State, + val cover: String, ) \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/uio/BookUio.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/uio/BookUio.kt index 3dc1531..0910634 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/uio/BookUio.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/uio/BookUio.kt @@ -1,8 +1,5 @@ package com.pixelized.biblib.ui.screen.home.common.uio -import androidx.compose.runtime.State -import androidx.compose.runtime.getValue - data class BookUio( val id: Int, val title: String, @@ -12,7 +9,5 @@ data class BookUio( val date: String?, val series: String?, val description: String, - private val coverState: State, -) { - val cover by coverState -} + val cover: String, +) diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/uio/CoverUio.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/uio/CoverUio.kt deleted file mode 100644 index 26dac43..0000000 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/uio/CoverUio.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.pixelized.biblib.ui.screen.home.common.uio - -import androidx.compose.runtime.Immutable -import androidx.compose.runtime.Stable -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.layout.ContentScale - -@Stable -@Immutable -data class CoverUio( - val type: Type, - val contentScale: ContentScale = ContentScale.FillBounds, - val colorFilter: ColorFilter? = null, - val painter: Painter, -) { - enum class Type { - PLACE_HOLDER, - THUMBNAIL, - DETAIL, - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/viewModel/ACoverViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/viewModel/ACoverViewModel.kt deleted file mode 100644 index 98439e9..0000000 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/viewModel/ACoverViewModel.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.pixelized.biblib.ui.screen.home.common.viewModel - -import android.app.Application -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.layout.ContentScale -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.viewModelScope -import com.pixelized.biblib.ui.screen.home.common.uio.CoverUio -import com.pixelized.biblib.utils.cache.BookCoverCache -import kotlinx.coroutines.CoroutineScope -import java.net.URL - - -abstract class ACoverViewModel( - application: Application, - private val cacheBook: BookCoverCache, -) : AndroidViewModel(application) { - - fun cover( - cacheBook: BookCoverCache = this.cacheBook, - coroutineScope: CoroutineScope = viewModelScope, - placeHolder: CoverUio, - type: CoverUio.Type, - contentScale: ContentScale = ContentScale.FillBounds, - tint: ColorFilter? = null, - url: URL, - ) = cacheBook.cover( - placeHolder = placeHolder, - coroutineScope = coroutineScope, - type = type, - contentScale = contentScale, - tint = tint, - url = url, - ) - - companion object { - const val PAGING_SIZE = 30 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BookThumbnail.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BookThumbnail.kt index 0c16095..1e4da48 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BookThumbnail.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BookThumbnail.kt @@ -8,18 +8,18 @@ import androidx.compose.foundation.layout.* import androidx.compose.material.Card import androidx.compose.material.MaterialTheme import androidx.compose.material.Text -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import com.pixelized.biblib.R import com.pixelized.biblib.ui.screen.home.common.uio.BookThumbnailUio -import com.pixelized.biblib.ui.screen.home.common.uio.CoverUio import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.utils.extention.bibLib +import com.skydoves.landscapist.glide.GlideImage @Composable fun BookThumbnail( @@ -40,9 +40,10 @@ fun BookThumbnail( verticalAlignment = Alignment.CenterVertically, ) { thumbnail?.cover?.let { it -> - Cover( + GlideImage( modifier = Modifier.size(MaterialTheme.bibLib.dimen.thumbnail.cover), - image = it, + previewPlaceholder = R.drawable.ic_launcher_foreground, + imageModel = it, ) } Column( @@ -51,16 +52,19 @@ fun BookThumbnail( .padding(MaterialTheme.bibLib.dimen.dp8) ) { Text( - style = MaterialTheme.typography.body1, + modifier = Modifier.padding(bottom = MaterialTheme.bibLib.dimen.dp4), + style = MaterialTheme.typography.h6, color = MaterialTheme.colors.onSurface, text = thumbnail?.title ?: "", - maxLines = 1, + maxLines = 2, overflow = TextOverflow.Ellipsis, ) Text( - style = MaterialTheme.typography.caption, + style = MaterialTheme.typography.body1, color = MaterialTheme.colors.onSurface, + maxLines = 1, + overflow = TextOverflow.Ellipsis, text = thumbnail?.author ?: "" ) @@ -86,33 +90,10 @@ fun BookThumbnail( } } -@OptIn(ExperimentalAnimationApi::class) -@Composable -private fun Cover( - modifier: Modifier = Modifier, - image: State -) { - val cover by image - AnimatedContent( - targetState = cover.painter, - transitionSpec = { fadeIn() with fadeOut() } - ) { - Image( - modifier = modifier, - alignment = Alignment.Center, - contentScale = cover.contentScale, - colorFilter = cover.colorFilter, - painter = cover.painter, - contentDescription = null, - ) - } -} - @Composable @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) private fun BookThumbnailPreview() { - val painter = painterResource(id = R.drawable.ic_baseline_auto_stories_24) val thumbnail = BookThumbnailUio( id = 0, genre = "Sci-Fi", @@ -120,15 +101,7 @@ private fun BookThumbnailPreview() { author = "Asimov", date = "1951", isNew = false, - cover = remember { - mutableStateOf( - CoverUio( - type = CoverUio.Type.PLACE_HOLDER, - contentScale = ContentScale.None, - painter = painter, - ) - ) - }, + cover = "", ) BibLibTheme { BookThumbnail(thumbnail = thumbnail) diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksPage.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksPage.kt index cc76bfa..e82db7e 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksPage.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksPage.kt @@ -1,6 +1,5 @@ package com.pixelized.biblib.ui.screen.home.page.books -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -23,6 +22,7 @@ import com.pixelized.biblib.ui.screen.home.common.composable.bookPreviewResource import com.pixelized.biblib.ui.screen.home.common.uio.BookThumbnailUio import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.utils.extention.bibLib +import com.pixelized.biblib.utils.extention.navigationBarsHeight @Composable @@ -38,7 +38,6 @@ fun BooksPage( ) } -@OptIn(ExperimentalFoundationApi::class) @Composable private fun BooksPageContent( isNetworkAvailable: () -> State, @@ -51,7 +50,10 @@ private fun BooksPageContent( isNetworkAvailable = isNetworkAvailable, ) LazyColumn( - contentPadding = PaddingValues(vertical = MaterialTheme.bibLib.dimen.thumbnail.padding), + contentPadding = PaddingValues( + top = MaterialTheme.bibLib.dimen.thumbnail.padding, + bottom = MaterialTheme.bibLib.dimen.thumbnail.padding + navigationBarsHeight(), + ), verticalArrangement = Arrangement.spacedBy(MaterialTheme.bibLib.dimen.thumbnail.arrangement), ) { items( diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksViewModel.kt index 46c1b86..e2eea46 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksViewModel.kt @@ -1,34 +1,24 @@ package com.pixelized.biblib.ui.screen.home.page.books -import android.app.Application import androidx.compose.runtime.Composable -import androidx.compose.ui.layout.ContentScale +import androidx.lifecycle.ViewModel import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.compose.collectAsLazyPagingItems -import com.pixelized.biblib.R import com.pixelized.biblib.model.book.Book import com.pixelized.biblib.network.client.IBibLibClient import com.pixelized.biblib.repository.book.IBookRepository import com.pixelized.biblib.ui.screen.home.common.uio.BookThumbnailUio -import com.pixelized.biblib.ui.screen.home.common.uio.CoverUio -import com.pixelized.biblib.ui.screen.home.common.viewModel.ACoverViewModel -import com.pixelized.biblib.utils.cache.BookCoverCache -import com.pixelized.biblib.utils.extention.context import com.pixelized.biblib.utils.extention.longDate -import com.pixelized.biblib.utils.painterResource import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers -import java.net.URL import javax.inject.Inject @HiltViewModel class BooksViewModel @Inject constructor( - application: Application, bookRepository: IBookRepository, - cacheBook: BookCoverCache, -) : ACoverViewModel(application, cacheBook) { +) : ViewModel() { private val booksSource = Pager( config = PagingConfig(pageSize = PAGING_SIZE), @@ -46,14 +36,10 @@ class BooksViewModel @Inject constructor( author = author.joinToString { it.name }, date = releaseDate.longDate(), isNew = isNew, - cover = cover( - placeHolder = CoverUio( - type = CoverUio.Type.PLACE_HOLDER, - contentScale = ContentScale.None, - painter = painterResource(context, R.drawable.ic_baseline_auto_stories_24), - ), - type = CoverUio.Type.THUMBNAIL, - url = URL("${IBibLibClient.THUMBNAIL_URL}/$id.jpg"), - ) + cover = "${IBibLibClient.THUMBNAIL_URL}/$id.jpg" ) + + companion object { + private const val PAGING_SIZE = 16 + } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewThumbnail.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewThumbnail.kt index ee72c6f..8b4ef53 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewThumbnail.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewThumbnail.kt @@ -2,7 +2,6 @@ package com.pixelized.biblib.ui.screen.home.page.news import android.content.res.Configuration import androidx.compose.animation.* -import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.aspectRatio @@ -10,20 +9,17 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.width import androidx.compose.material.MaterialTheme import androidx.compose.material.Text -import androidx.compose.runtime.* -import androidx.compose.ui.Alignment +import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.pixelized.biblib.R import com.pixelized.biblib.ui.screen.home.common.uio.BookThumbnailUio -import com.pixelized.biblib.ui.screen.home.common.uio.CoverUio import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.utils.extention.bibLib +import com.skydoves.landscapist.glide.GlideImage +import com.pixelized.biblib.R @Composable fun NewThumbnail( @@ -35,12 +31,13 @@ fun NewThumbnail( modifier = modifier.clickable { thumbnail?.let(onClick) } ) { thumbnail?.cover?.let { it -> - Cover( + GlideImage( modifier = Modifier .fillMaxWidth() .clip(MaterialTheme.bibLib.shape.base.medium) .aspectRatio(64f / 102f), - image = it, + previewPlaceholder = R.drawable.ic_baseline_auto_stories_24, + imageModel = it, ) } @@ -66,33 +63,10 @@ fun NewThumbnail( } } -@OptIn(ExperimentalAnimationApi::class) -@Composable -private fun Cover( - modifier: Modifier = Modifier, - image: State -) { - val cover by image - AnimatedContent( - targetState = cover.painter, - transitionSpec = { fadeIn() with fadeOut() } - ) { - Image( - modifier = modifier, - alignment = Alignment.Center, - contentScale = cover.contentScale, - colorFilter = cover.colorFilter, - painter = cover.painter, - contentDescription = null, - ) - } -} - @Composable @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) private fun BookThumbnailPreview() { - val painter = painterResource(id = R.drawable.ic_baseline_auto_stories_24) val thumbnail = BookThumbnailUio( id = 0, genre = "Sci-Fi", @@ -100,15 +74,7 @@ private fun BookThumbnailPreview() { author = "Asimov", date = "1951", isNew = false, - cover = remember { - mutableStateOf( - CoverUio( - type = CoverUio.Type.PLACE_HOLDER, - contentScale = ContentScale.None, - painter = painter, - ) - ) - }, + cover = "", ) BibLibTheme { NewThumbnail( diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsBookViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsBookViewModel.kt index 532ef07..4b064d9 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsBookViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsBookViewModel.kt @@ -1,37 +1,26 @@ package com.pixelized.biblib.ui.screen.home.page.news -import android.app.Application import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.ui.layout.ContentScale +import androidx.lifecycle.ViewModel import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems -import com.pixelized.biblib.R import com.pixelized.biblib.model.book.Book import com.pixelized.biblib.network.client.IBibLibClient import com.pixelized.biblib.repository.book.IBookRepository import com.pixelized.biblib.ui.screen.home.common.uio.BookThumbnailUio -import com.pixelized.biblib.ui.screen.home.common.uio.CoverUio -import com.pixelized.biblib.ui.screen.home.common.viewModel.ACoverViewModel -import com.pixelized.biblib.utils.cache.BookCoverCache -import com.pixelized.biblib.utils.extention.context import com.pixelized.biblib.utils.extention.longDate -import com.pixelized.biblib.utils.painterResource import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow -import java.net.URL import javax.inject.Inject @HiltViewModel class NewsBookViewModel @Inject constructor( - application: Application, bookRepository: IBookRepository, - cacheBook: BookCoverCache, -) : ACoverViewModel(application, cacheBook) { +) : ViewModel() { private val newsSource: Flow> = Pager( config = PagingConfig(pageSize = PAGING_SIZE), @@ -42,16 +31,7 @@ class NewsBookViewModel @Inject constructor( val news @Composable get() = newsSource.collectAsLazyPagingItems() - private fun Book.toThumbnail() : BookThumbnailUio{ - val thumbnail by cover( - placeHolder = CoverUio( - type = CoverUio.Type.PLACE_HOLDER, - contentScale = ContentScale.None, - painter = painterResource(context, R.drawable.ic_baseline_auto_stories_24), - ), - type = CoverUio.Type.THUMBNAIL, - url = URL("${IBibLibClient.THUMBNAIL_URL}/$id.jpg"), - ) + private fun Book.toThumbnail(): BookThumbnailUio { return BookThumbnailUio( id = id, genre = genre?.joinToString { it.name } ?: "", @@ -59,11 +39,11 @@ class NewsBookViewModel @Inject constructor( author = author.joinToString { it.name }, date = releaseDate.longDate(), isNew = isNew, - cover = cover( - placeHolder = thumbnail, - type = CoverUio.Type.DETAIL, - url = URL("${IBibLibClient.COVER_URL}/$id.jpg"), - ) + cover = "${IBibLibClient.COVER_URL}/$id.jpg" ) } + + companion object { + private const val PAGING_SIZE = 8 + } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsPage.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsPage.kt index 27bed54..746d780 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsPage.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsPage.kt @@ -2,16 +2,9 @@ package com.pixelized.biblib.ui.screen.home.page.news import android.content.res.Configuration.UI_MODE_NIGHT_NO import android.content.res.Configuration.UI_MODE_NIGHT_YES -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyItemScope +import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.grid.GridCells -import androidx.compose.foundation.lazy.grid.LazyGridScope import androidx.compose.foundation.lazy.grid.LazyVerticalGrid -import androidx.compose.foundation.lazy.grid.items import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.State @@ -21,7 +14,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import androidx.paging.compose.LazyPagingItems -import androidx.paging.compose.items import com.pixelized.biblib.ui.scaffold.BottomDetailState import com.pixelized.biblib.ui.scaffold.LocalBottomDetailState import com.pixelized.biblib.ui.screen.connectivity.ConnectivityViewModel @@ -30,7 +22,7 @@ import com.pixelized.biblib.ui.screen.home.common.composable.bookPreviewResource import com.pixelized.biblib.ui.screen.home.common.uio.BookThumbnailUio import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.utils.extention.bibLib -import java.util.* +import com.pixelized.biblib.utils.extention.navigationBarsHeight @Composable fun NewsPage( @@ -58,10 +50,16 @@ private fun NewsPageContent( isNetworkAvailable = isNetworkAvailable, ) LazyVerticalGrid( + modifier = Modifier.weight(1f), columns = GridCells.Fixed(2), - contentPadding = PaddingValues(all = MaterialTheme.bibLib.dimen.thumbnail.padding), + contentPadding = PaddingValues( + start = MaterialTheme.bibLib.dimen.thumbnail.padding, + end = MaterialTheme.bibLib.dimen.thumbnail.padding, + top = MaterialTheme.bibLib.dimen.thumbnail.padding, + bottom = MaterialTheme.bibLib.dimen.thumbnail.padding + navigationBarsHeight(), + ), verticalArrangement = Arrangement.spacedBy(MaterialTheme.bibLib.dimen.thumbnail.arrangement), - horizontalArrangement = Arrangement.spacedBy(MaterialTheme.bibLib.dimen.thumbnail.arrangement) + horizontalArrangement = Arrangement.spacedBy(MaterialTheme.bibLib.dimen.thumbnail.arrangement), ) { items( count = books.itemCount diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileScreen.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileScreen.kt index ebfa1c7..27575f4 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileScreen.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileScreen.kt @@ -18,7 +18,7 @@ import com.pixelized.biblib.network.client.IBibLibClient import com.pixelized.biblib.ui.composable.StateUio import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.utils.extention.bibLib -import com.pixelized.biblib.utils.extention.todo +import com.pixelized.biblib.utils.extention.default @Composable fun ProfileScreen( @@ -33,7 +33,7 @@ fun ProfileScreen( onEditClick = { val intent = Intent(Intent.ACTION_VIEW, Uri.parse(IBibLibClient.EDIT_PROFILE)) context.startActivity(intent) - } + }, ) is StateUio.Failure -> Unit } @@ -43,7 +43,8 @@ fun ProfileScreen( private fun ProfileScreenContent( modifier: Modifier = Modifier, user: UserUio, - onEditClick: () -> Unit = todo() + onEditClick: () -> Unit = default(), + onLogoutClick: () -> Unit = default(), ) { Column(modifier = modifier.fillMaxWidth()) { Text( @@ -107,8 +108,19 @@ private fun ProfileScreenContent( text = "Edit profile" ) } - } + Button( + modifier = Modifier + .padding(top = MaterialTheme.bibLib.dimen.dp8) + .align(Alignment.End), + colors = ButtonDefaults.outlinedButtonColors(), + onClick = onLogoutClick, + ) { + Text( + text = "Logout" + ) + } + } } @Composable diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileViewModel.kt index 27468c5..010eda2 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileViewModel.kt @@ -1,17 +1,15 @@ package com.pixelized.biblib.ui.screen.profile -import android.app.Application import android.util.Log import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.pixelized.biblib.model.user.User import com.pixelized.biblib.network.client.IBibLibClient import com.pixelized.biblib.network.factory.UserFactory import com.pixelized.biblib.ui.composable.StateUio -import com.pixelized.biblib.ui.screen.home.common.viewModel.ACoverViewModel -import com.pixelized.biblib.utils.cache.BookCoverCache import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -19,10 +17,8 @@ import javax.inject.Inject @HiltViewModel class ProfileViewModel @Inject constructor( - application: Application, - cacheBook: BookCoverCache, private val client: IBibLibClient, -) : ACoverViewModel(application, cacheBook) { +) : ViewModel() { var user by mutableStateOf>(StateUio.Progress()) private set diff --git a/app/src/main/java/com/pixelized/biblib/ui/theme/dimen/BibLibDimen.kt b/app/src/main/java/com/pixelized/biblib/ui/theme/dimen/BibLibDimen.kt index 9a92bc1..94680df 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/theme/dimen/BibLibDimen.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/theme/dimen/BibLibDimen.kt @@ -33,7 +33,7 @@ data class BibLibDimen( data class BookThumbnail( val padding: Dp = 16.dp, val arrangement: Dp = 16.dp, - val cover: DpSize = DpSize(64.dp, 102.dp), // ratio 1.6 + val cover: DpSize = DpSize(width = 72.dp, height = 115.dp), // ratio 1.6 val corner: Dp = 8.dp, ) diff --git a/app/src/main/java/com/pixelized/biblib/utils/cache/BookCoverCache.kt b/app/src/main/java/com/pixelized/biblib/utils/cache/BookCoverCache.kt deleted file mode 100644 index 047f3d3..0000000 --- a/app/src/main/java/com/pixelized/biblib/utils/cache/BookCoverCache.kt +++ /dev/null @@ -1,74 +0,0 @@ -package com.pixelized.biblib.utils.cache - -import android.graphics.BitmapFactory -import android.util.Log -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.State -import androidx.compose.runtime.mutableStateOf -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.asImageBitmap -import androidx.compose.ui.graphics.painter.BitmapPainter -import androidx.compose.ui.layout.ContentScale -import com.pixelized.biblib.ui.screen.home.common.uio.CoverUio -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import java.net.URL -import javax.inject.Inject - -class BookCoverCache @Inject constructor( - private val cache: ImageCache -) { - fun cover( - coroutineScope: CoroutineScope, - placeHolder: CoverUio, - url: URL, - type: CoverUio.Type, - contentScale: ContentScale, - tint: ColorFilter?, - ): State { - // read the cache a convert it to a UIO. - val cache = cache.readFromDisk(url)?.let { - CoverUio( - type = type, - contentScale = contentScale, - colorFilter = tint, - painter = BitmapPainter(it.asImageBitmap()), - ) - } - // publish the cache and stop there, or publish the placeHolder and download the proper file. - return mutableStateOf(cache ?: placeHolder).also { - if (cache == null) { - coroutineScope.launch(Dispatchers.IO) { - it.download( - type = type, - contentScale = contentScale, - tint = tint, - url = url, - ) - } - } - } - } - - private fun MutableState.download( - type: CoverUio.Type, - contentScale: ContentScale, - tint: ColorFilter?, - url: URL, - ) { - try { - val bitmap = BitmapFactory.decodeStream(url.openStream()) - val painter = BitmapPainter(bitmap.asImageBitmap()) - cache.writeToDisk(url, bitmap) - value = CoverUio( - type = type, - contentScale = contentScale, - colorFilter = tint, - painter = painter, - ) - } catch (exception: Exception) { - Log.w("CoverCache", "Fail to download: {$url}", exception) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/utils/cache/ImageCache.kt b/app/src/main/java/com/pixelized/biblib/utils/cache/ImageCache.kt deleted file mode 100644 index cb4cb33..0000000 --- a/app/src/main/java/com/pixelized/biblib/utils/cache/ImageCache.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.pixelized.biblib.utils.cache - -import android.content.Context -import android.graphics.Bitmap -import android.graphics.BitmapFactory -import android.util.Log -import java.io.File -import java.io.IOException -import java.net.URL -import javax.inject.Inject - -class ImageCache @Inject constructor(context: Context) { - - private var cache: File? = context.cacheDir - - private fun file(url: URL): File = File(cache?.absolutePath + url.file) - - fun writeToDisk(url: URL, bitmap: Bitmap) { - val file = file(url) - try { - file.mkdirs() - file.delete() - bitmap.compress(Bitmap.CompressFormat.JPEG, 100, file.outputStream()) - } catch (e: Exception) { - Log.e("BitmapCache", "bitmap?.compress() FAILED !", e) - } - } - - fun readFromDisk(url: URL): Bitmap? { - val file = file(url) - return try { - if (file.exists()) BitmapFactory.decodeStream(file.inputStream()) else null - } catch (e: IOException) { - null - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/utils/extention/ContextEx.kt b/app/src/main/java/com/pixelized/biblib/utils/extention/ContextEx.kt index f258cb0..5dc9903 100644 --- a/app/src/main/java/com/pixelized/biblib/utils/extention/ContextEx.kt +++ b/app/src/main/java/com/pixelized/biblib/utils/extention/ContextEx.kt @@ -13,7 +13,7 @@ fun Context.notImplemented() { } @Composable -fun todo(): () -> Unit { +fun default(): () -> Unit { val context = LocalContext.current return { context.notImplemented() } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/utils/extention/LogEx.kt b/app/src/main/java/com/pixelized/biblib/utils/extention/LogEx.kt deleted file mode 100644 index 85fe020..0000000 --- a/app/src/main/java/com/pixelized/biblib/utils/extention/LogEx.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.pixelized.biblib.utils.extention - -import android.util.Log - -fun logC(message: String): Int = Log.v("Composition", message) \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/utils/extention/WindowInsetsEx.kt b/app/src/main/java/com/pixelized/biblib/utils/extention/WindowInsetsEx.kt new file mode 100644 index 0000000..fed81bc --- /dev/null +++ b/app/src/main/java/com/pixelized/biblib/utils/extention/WindowInsetsEx.kt @@ -0,0 +1,11 @@ +package com.pixelized.biblib.utils.extention + +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.runtime.Composable +import androidx.compose.ui.unit.Dp + +@Composable +fun navigationBarsHeight(): Dp = + WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_google.xml b/app/src/main/res/drawable/ic_google.xml index 5c1b1b1..0f7d2dc 100644 --- a/app/src/main/res/drawable/ic_google.xml +++ b/app/src/main/res/drawable/ic_google.xml @@ -1,7 +1,18 @@ - - - - - + + + + +