diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/ImageModerationProcessor.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/ImageModerationProcessor.kt index 142c36754..0f2227d98 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/ImageModerationProcessor.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/ImageModerationProcessor.kt @@ -8,9 +8,10 @@ import com.london.imageharamblur.models.GenderDetectionModel import com.london.imageharamblur.models.ModelDownloadManager import com.london.imageharamblur.ui.ModerationCacheManager import com.london.imageharamblur.utils.cropFace -import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext internal class ImageModerationProcessor(private val context: Context) { companion object { @@ -163,4 +164,4 @@ internal class ImageModerationProcessor(private val context: Context) { } } } -} \ No newline at end of file +} diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/extensions/BitmapExtensions.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/extensions/BitmapExtensions.kt index 2ca47dacb..23899f9d6 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/extensions/BitmapExtensions.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/extensions/BitmapExtensions.kt @@ -16,4 +16,4 @@ internal fun Drawable.toBitmap(): Bitmap? { setBounds(0, 0, canvas.width, canvas.height) draw(canvas) return bitmap -} \ No newline at end of file +} diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/faceDetection/DetectedFace.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/faceDetection/DetectedFace.kt index b7a68dda7..f7e0b1075 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/faceDetection/DetectedFace.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/faceDetection/DetectedFace.kt @@ -1,7 +1,8 @@ package com.london.imageharamblur.faceDetection + import android.graphics.Rect data class DetectedFace( val boundingBox: Rect, val confidence: Float -) \ No newline at end of file +) diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/faceDetection/FaceDetector.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/faceDetection/FaceDetector.kt index 14c52f1b6..ab3d090e8 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/faceDetection/FaceDetector.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/faceDetection/FaceDetector.kt @@ -1,9 +1,19 @@ package com.london.imageharamblur.faceDetection import android.content.Context -import android.graphics.* +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.ColorMatrix +import android.graphics.ColorMatrixColorFilter +import android.graphics.Paint +import android.graphics.Rect import androidx.core.graphics.get import androidx.core.graphics.scale +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext import org.tensorflow.lite.Interpreter import org.tensorflow.lite.support.common.FileUtil import java.nio.ByteBuffer @@ -11,10 +21,6 @@ import java.nio.ByteOrder import kotlin.math.exp import kotlin.math.max import kotlin.math.min -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock -import kotlinx.coroutines.withContext class FaceDetector(private val context: Context) { @@ -239,12 +245,14 @@ class FaceDetector(private val context: Context) { val scale = contrast val translate = brightness + 128f * (1 - contrast) - colorMatrix.set(floatArrayOf( - scale, 0f, 0f, 0f, translate, - 0f, scale, 0f, 0f, translate, - 0f, 0f, scale, 0f, translate, - 0f, 0f, 0f, 1f, 0f - )) + colorMatrix.set( + floatArrayOf( + scale, 0f, 0f, 0f, translate, + 0f, scale, 0f, 0f, translate, + 0f, 0f, scale, 0f, translate, + 0f, 0f, 0f, 1f, 0f + ) + ) paint.colorFilter = ColorMatrixColorFilter(colorMatrix) canvas.drawBitmap(bitmap, 0f, 0f, paint) @@ -323,10 +331,14 @@ class FaceDetector(private val context: Context) { val paddedW = w * padding val paddedH = h * padding - val left = ((cx - paddedW * 0.5f) * imageWidth).coerceIn(0f, imageWidth.toFloat()).toInt() - val top = ((cy - paddedH * 0.5f) * imageHeight).coerceIn(0f, imageHeight.toFloat()).toInt() - val right = ((cx + paddedW * 0.5f) * imageWidth).coerceIn(0f, imageWidth.toFloat()).toInt() - val bottom = ((cy + paddedH * 0.5f) * imageHeight).coerceIn(0f, imageHeight.toFloat()).toInt() + val left = + ((cx - paddedW * 0.5f) * imageWidth).coerceIn(0f, imageWidth.toFloat()).toInt() + val top = + ((cy - paddedH * 0.5f) * imageHeight).coerceIn(0f, imageHeight.toFloat()).toInt() + val right = + ((cx + paddedW * 0.5f) * imageWidth).coerceIn(0f, imageWidth.toFloat()).toInt() + val bottom = + ((cy + paddedH * 0.5f) * imageHeight).coerceIn(0f, imageHeight.toFloat()).toInt() val rect = Rect(left, top, right, bottom) @@ -377,11 +389,12 @@ class FaceDetector(private val context: Context) { bestOverlap = selectedFace } - val adaptiveThreshold = if (face.confidence > 0.8f && selectedFace.confidence > 0.8f) { - IOU_THRESHOLD * 0.8f - } else { - IOU_THRESHOLD - } + val adaptiveThreshold = + if (face.confidence > 0.8f && selectedFace.confidence > 0.8f) { + IOU_THRESHOLD * 0.8f + } else { + IOU_THRESHOLD + } if (iou > adaptiveThreshold) { shouldSelect = false @@ -412,7 +425,7 @@ class FaceDetector(private val context: Context) { val intersectionBottom = min(box1.bottom, box2.bottom) val intersectionArea = max(0, intersectionRight - intersectionLeft) * - max(0, intersectionBottom - intersectionTop) + max(0, intersectionBottom - intersectionTop) val box1Area = box1.width() * box1.height() val box2Area = box2.width() * box2.height() diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/models/ContentDetectionModel.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/models/ContentDetectionModel.kt index 4afb6e9cd..78b34eb12 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/models/ContentDetectionModel.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/models/ContentDetectionModel.kt @@ -2,6 +2,10 @@ package com.london.imageharamblur.models import android.content.Context import android.graphics.Bitmap +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext import org.tensorflow.lite.DataType import org.tensorflow.lite.Interpreter import org.tensorflow.lite.support.common.FileUtil @@ -14,10 +18,6 @@ import java.io.File import java.io.FileInputStream import java.nio.MappedByteBuffer import java.nio.channels.FileChannel -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock -import kotlinx.coroutines.withContext internal class ContentDetectionModel { @@ -148,7 +148,8 @@ internal class ContentDetectionModel { suspend fun detectContent(bitmap: Bitmap): ContentResult = withContext(Dispatchers.IO) { interpreterLock.withLock { try { - val interpreter = getOrCreateInterpreter() ?: return@withContext ContentResult(isInappropriate = false) + val interpreter = + getOrCreateInterpreter() ?: return@withContext ContentResult(isInappropriate = false) // Validate interpreter state if (interpreter.outputTensorCount == 0) { @@ -176,18 +177,21 @@ internal class ContentDetectionModel { outputBuffer.buffer.asFloatBuffer().get(floatArray) floatArray } + DataType.UINT8 -> { val byteArray = ByteArray(outputSize) outputBuffer.buffer.rewind() outputBuffer.buffer.get(byteArray) byteArray.map { (it.toInt() and 0xFF) / 255f }.toFloatArray() } + DataType.INT8 -> { val byteArray = ByteArray(outputSize) outputBuffer.buffer.rewind() outputBuffer.buffer.get(byteArray) byteArray.map { (it.toFloat() + 128f) / 255f }.toFloatArray() } + else -> FloatArray(outputSize) } @@ -210,10 +214,12 @@ internal class ContentDetectionModel { } fun close() { - try {0 + try { + 0 interpreterThreadLocal.get()?.close() interpreterThreadLocal.remove() - } catch (e: Exception) {} + } catch (e: Exception) { + } } companion object { @@ -224,4 +230,4 @@ internal class ContentDetectionModel { internal data class ContentResult( val isInappropriate: Boolean -) \ No newline at end of file +) diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/models/GenderDetectionModel.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/models/GenderDetectionModel.kt index 568e3df30..94f23479c 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/models/GenderDetectionModel.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/models/GenderDetectionModel.kt @@ -181,4 +181,4 @@ internal class GenderDetectionModel { internal data class GenderResult( val isFemale: Boolean, val confidence: Float -) \ No newline at end of file +) diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/models/ModelDownloadManager.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/models/ModelDownloadManager.kt index 27808e336..f0455a927 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/models/ModelDownloadManager.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/models/ModelDownloadManager.kt @@ -1,15 +1,22 @@ package com.london.imageharamblur.models import android.content.Context +import androidx.core.content.edit import com.google.firebase.ml.modeldownloader.CustomModel import com.google.firebase.ml.modeldownloader.CustomModelDownloadConditions import com.google.firebase.ml.modeldownloader.DownloadType import com.google.firebase.ml.modeldownloader.FirebaseModelDownloader -import kotlinx.coroutines.* +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch import kotlinx.coroutines.tasks.await +import kotlinx.coroutines.withContext import java.io.File import java.util.concurrent.atomic.AtomicBoolean -import androidx.core.content.edit class ModelDownloadManager(context: Context) { @@ -96,7 +103,8 @@ class ModelDownloadManager(context: Context) { if (genderModel?.file != null && nsfwModel?.file != null) { if (genderModel.file!!.exists() && genderModel.file!!.length() > 0 && - nsfwModel.file!!.exists() && nsfwModel.file!!.length() > 0) { + nsfwModel.file!!.exists() && nsfwModel.file!!.length() > 0 + ) { saveModelVersions(genderModel, nsfwModel) prefs.edit { putBoolean(PREF_FIREBASE_MODELS_READY, true) } @@ -121,7 +129,8 @@ class ModelDownloadManager(context: Context) { if (genderModel?.file != null && nsfwModel?.file != null && genderModel.file!!.exists() && nsfwModel.file!!.exists() && - genderModel.file!!.length() > 0 && nsfwModel.file!!.length() > 0) { + genderModel.file!!.length() > 0 && nsfwModel.file!!.length() > 0 + ) { return@withContext ModelFiles( genderModelFile = genderModel.file!!, @@ -152,4 +161,4 @@ class ModelDownloadManager(context: Context) { ) } -} \ No newline at end of file +} diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ImageModerationController.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ImageModerationController.kt index 99821e83c..7681e978f 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ImageModerationController.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ImageModerationController.kt @@ -4,8 +4,8 @@ import android.content.Context import android.graphics.drawable.Drawable import android.os.Build import com.london.imageharamblur.ImageModerationProcessor -import com.london.imageharamblur.utils.blurBitmap import com.london.imageharamblur.extensions.toBitmap +import com.london.imageharamblur.utils.blurBitmap import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -101,4 +101,4 @@ internal class ImageModerationController( fun close() { processor?.close() } -} \ No newline at end of file +} diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ImageModerationState.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ImageModerationState.kt index 5a85044bb..f18bb7905 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ImageModerationState.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ImageModerationState.kt @@ -9,4 +9,4 @@ data class ImageModerationState( val originalBitmap: Bitmap? = null, val blurredBitmap: Bitmap? = null, val error: String? = null -) \ No newline at end of file +) diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ImageViewFilter.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ImageViewFilter.kt index b9ca54636..22b34f287 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ImageViewFilter.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ImageViewFilter.kt @@ -122,9 +122,11 @@ fun ImageViewFilter( isLoading -> { loadingContent() } + errorState != null -> { errorContent(errorState) } + moderationState != null && moderationState!!.isModerated -> { if (moderationState!!.shouldBlur && config.showCustomContentWhenBlurred) { moderatedContent() @@ -139,9 +141,9 @@ fun ImageViewFilter( blurStrength = config.blurStrength, modifier = Modifier.fillMaxSize() ) - if (moderationState!!.shouldBlur){ - moderatedContent() - } + if (moderationState!!.shouldBlur) { + moderatedContent() + } // Show text overlay when image should be blurred but showTextInsteadOfBlur is true if (moderationState!!.shouldBlur && config.showTextInsteadOfBlur) { @@ -212,4 +214,4 @@ private fun createModerationController( cacheKey = imageKey, enableModeration = config.enableModeration, blurStrength = config.blurStrength -) \ No newline at end of file +) diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ModeratedImage.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ModeratedImage.kt index 87fc39b88..09862c3b1 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ModeratedImage.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ModeratedImage.kt @@ -31,6 +31,7 @@ fun ModeratedImage( contentScale = contentScale, blurStrength = blurStrength ) + else -> NormalImage( bitmap = state.originalBitmap, contentDescription = contentDescription, @@ -56,6 +57,7 @@ private fun BlurredImage( contentScale = contentScale, blurStrength = blurStrength ) + else -> PreProcessedBlurImage( bitmap = state.blurredBitmap ?: state.originalBitmap!!, contentDescription = contentDescription, @@ -111,4 +113,4 @@ private fun NormalImage( contentScale = contentScale, modifier = modifier.fillMaxSize() ) -} \ No newline at end of file +} diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ModerationCacheManager.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ModerationCacheManager.kt index c1647edae..fd8d9235b 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ModerationCacheManager.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/ui/ModerationCacheManager.kt @@ -1,6 +1,5 @@ package com.london.imageharamblur.ui -import android.util.Log import androidx.collection.LruCache import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -25,4 +24,4 @@ object ModerationCacheManager { } fun size(): Int = cache.size() -} \ No newline at end of file +} diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/utils/BitmapBlur.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/utils/BitmapBlur.kt index 06531a270..a124d4254 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/utils/BitmapBlur.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/utils/BitmapBlur.kt @@ -76,4 +76,4 @@ internal suspend fun blurBitmap(input: Bitmap, radius: Int): Bitmap = } Bitmap.createBitmap(pixels, w, h, input.config) - } \ No newline at end of file + } diff --git a/ImageHaramBlur/src/main/java/com/london/imageharamblur/utils/BitmapUtils.kt b/ImageHaramBlur/src/main/java/com/london/imageharamblur/utils/BitmapUtils.kt index e66a6f3b0..cdd405281 100644 --- a/ImageHaramBlur/src/main/java/com/london/imageharamblur/utils/BitmapUtils.kt +++ b/ImageHaramBlur/src/main/java/com/london/imageharamblur/utils/BitmapUtils.kt @@ -11,4 +11,4 @@ fun cropFace(bitmap: Bitmap, face: DetectedFace): Bitmap { val bottom = rect.bottom.coerceAtMost(bitmap.height) return Bitmap.createBitmap(bitmap, left, top, right - left, bottom - top) -} \ No newline at end of file +} diff --git a/ImageHaramBlur/src/test/java/com/london/imageharamblur/ExampleUnitTest.kt b/ImageHaramBlur/src/test/java/com/london/imageharamblur/ExampleUnitTest.kt deleted file mode 100644 index 1c9fde41b..000000000 --- a/ImageHaramBlur/src/test/java/com/london/imageharamblur/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.london.imageharamblur - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/london/app/MainActivity.kt b/app/src/main/java/com/london/app/MainActivity.kt index 7b326ee3a..d1287532b 100644 --- a/app/src/main/java/com/london/app/MainActivity.kt +++ b/app/src/main/java/com/london/app/MainActivity.kt @@ -34,6 +34,7 @@ import javax.inject.Inject @AndroidEntryPoint class MainActivity : ComponentActivity() { + @Inject lateinit var appPreferencesService: AppPreferencesService @@ -69,7 +70,6 @@ class MainActivity : ComponentActivity() { NovixTheme(isAppDarkMode = isAppDarkMode) { ApplySystemBarTheme(useDarkTheme = isAppDarkMode) - ContentRestrictionProvider(appPreferencesService) { contentRestrictionLevel -> CompositionLocalProvider( LocalContentRestrictionLevel provides contentRestrictionLevel diff --git a/app/src/main/java/com/london/app/di/NetworkModule.kt b/app/src/main/java/com/london/app/di/NetworkModule.kt index dc7bb1e8b..2c0e08233 100644 --- a/app/src/main/java/com/london/app/di/NetworkModule.kt +++ b/app/src/main/java/com/london/app/di/NetworkModule.kt @@ -149,4 +149,4 @@ object NetworkModule { @Singleton fun provideAccountApiService(retrofit: Retrofit): AccountApiService = retrofit.create(AccountApiService::class.java) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/london/app/di/WorkerModule.kt b/app/src/main/java/com/london/app/di/WorkerModule.kt index 6699f1467..848377953 100644 --- a/app/src/main/java/com/london/app/di/WorkerModule.kt +++ b/app/src/main/java/com/london/app/di/WorkerModule.kt @@ -18,4 +18,4 @@ object WorkerModule { fun provideWorkManager( @ApplicationContext context: Context ): WorkManager = WorkManager.getInstance(context) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/london/app/navigation/AppNavGraph.kt b/app/src/main/java/com/london/app/navigation/AppNavGraph.kt index 6298dddfa..98a6beb28 100644 --- a/app/src/main/java/com/london/app/navigation/AppNavGraph.kt +++ b/app/src/main/java/com/london/app/navigation/AppNavGraph.kt @@ -15,4 +15,4 @@ sealed interface AppNavGraph { @Serializable data object Main : AppNavGraph -} \ No newline at end of file +} diff --git a/app/src/main/java/com/london/app/navigation/NavHostGraph.kt b/app/src/main/java/com/london/app/navigation/NavHostGraph.kt index 2ee91696d..022fca3ce 100644 --- a/app/src/main/java/com/london/app/navigation/NavHostGraph.kt +++ b/app/src/main/java/com/london/app/navigation/NavHostGraph.kt @@ -30,6 +30,7 @@ import com.london.presentation.navigation.Screen.Search @Composable fun NavHostGraph() { + val navController = rememberNavController() val navBackStackEntry by navController.currentBackStackEntryAsState() val showBottomNav = navBackStackEntry.hasRoute(Home, Search, Categories, Lists(), Account) diff --git a/app/src/main/java/com/london/app/navigation/NavigationHelper.kt b/app/src/main/java/com/london/app/navigation/NavigationHelper.kt index 135a25ef9..62049dbfc 100644 --- a/app/src/main/java/com/london/app/navigation/NavigationHelper.kt +++ b/app/src/main/java/com/london/app/navigation/NavigationHelper.kt @@ -39,4 +39,4 @@ class NavigationHelper { ) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/london/app/navigation/appDestination.kt b/app/src/main/java/com/london/app/navigation/appDestination.kt index 508768fc8..3ccc63746 100644 --- a/app/src/main/java/com/london/app/navigation/appDestination.kt +++ b/app/src/main/java/com/london/app/navigation/appDestination.kt @@ -31,6 +31,7 @@ import com.london.presentation.shared.genre.TvShowGenreUi fun NavController.navigateToEpisodeDetails(tvShowId: Int, seasonNumber: Int, episodeNumber: Int) = navigate(EpisodeDetails(tvShowId, episodeNumber, seasonNumber)) + fun NavController.navigateToMovieDetails(movieId: Int) = navigate(MovieDetails(movieId)) @@ -40,7 +41,6 @@ fun NavController.navigateToTvShowDetails(tvShowId: Int) = fun NavController.navigateToActorDetails(actorId: Int) = navigate(ActorDetails(actorId)) - fun NavController.navigateToActorGallery(actorId: Int) = navigate(ActorGallery(actorId)) @@ -62,26 +62,34 @@ fun NavController.navigateToReviews(movieId: Int, mediaType: MediaType) = fun NavController.navigateToLoginWithPopUp() = navigateTo(Login) fun NavController.navigateToLogin() = navigate(Login) + fun NavController.navigateToWatchingHistory() = navigate(WatchingHistory) + fun NavController.navigateToMyRating() = navigate(MyRating) fun NavController.navigateToContinueWatching() = navigate(ContinueWatching) + fun NavController.navigateToTopRated() = navigate(TopRated) + fun NavController.navigateToTrendingMovies() = navigate(TrendingMovies) + fun NavController.navigateToTrendingTvShows() = navigate(TrendingTvShows) + fun NavController.navigateToTrendingActors() = navigate(TrendingActors) fun NavController.navigateToRegister() = navigate(Register) fun NavController.navigateToAuthGraph() = navigateTo(AppNavGraph.Auth) + fun NavController.navigateToMainGraph() = navigateTo(AppNavGraph.Main) + fun NavController.navigateToOnboardingGraph() = navigateTo(AppNavGraph.OnBoarding) fun NavController.navigateToWelcome() = navigateTo(OnBoarding.Welcome) fun NavController.navigateToListDetails(listId: Int) = navigate(Screen.ViewListItems(listId)) - fun navigateToBottomBarDestination( +fun navigateToBottomBarDestination( navController: NavHostController, destination: Any ) { diff --git a/app/src/main/java/com/london/app/navigation/graph/authNavGraph.kt b/app/src/main/java/com/london/app/navigation/graph/authNavGraph.kt index 7fe75e231..688da9c07 100644 --- a/app/src/main/java/com/london/app/navigation/graph/authNavGraph.kt +++ b/app/src/main/java/com/london/app/navigation/graph/authNavGraph.kt @@ -31,4 +31,4 @@ fun NavGraphBuilder.authNavGraph( onRegisterComplete = navController::navigateToLoginWithPopUp ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/london/app/navigation/graph/mainNavGraph.kt b/app/src/main/java/com/london/app/navigation/graph/mainNavGraph.kt index d15abc88a..ab5f009bb 100644 --- a/app/src/main/java/com/london/app/navigation/graph/mainNavGraph.kt +++ b/app/src/main/java/com/london/app/navigation/graph/mainNavGraph.kt @@ -74,7 +74,6 @@ import com.london.presentation.navigation.Screen.TvShowsByCategory import com.london.presentation.navigation.Screen.ViewListItems import com.london.presentation.navigation.Screen.WatchingHistory - fun NavGraphBuilder.mainNavGraph( navController: NavHostController ) = navigation(startDestination = Home) { @@ -205,7 +204,6 @@ private fun NavGraphBuilder.movieDetailsNavGraph(navController: NavHostControlle } } - private fun NavGraphBuilder.tvShowDetailsNavGraph(navController: NavHostController) = with(navController) { appComposable { @@ -249,6 +247,7 @@ private fun NavGraphBuilder.actorDetailsNavGraph(navController: NavHostControlle onNavigateBack = ::navigateUp, ) } + composable { ActorDetailsScreen( onNavigateToTopMoviePicks = ::navigateToTopMoviesPicks, @@ -264,22 +263,26 @@ private fun NavGraphBuilder.actorDetailsNavGraph(navController: NavHostControlle private fun NavGraphBuilder.trendingNavGraph(navController: NavHostController) = with(navController) { + composable { TrendingMoviesScreen( onNavigateToMovieDetailsClick = ::navigateToMovieDetails, onNavigateBackClick = ::navigateUp ) } + composable { TrendingTvShowsScreen( onNavigateToTvShowDetailsClick = ::navigateToTvShowDetails, onNavigateBack = ::navigateUp ) } + composable { TrendingActorsScreen( onNavigateToActorDetailsClick = ::navigateToActorDetails, onNavigateBackClick = ::navigateUp ) } + } diff --git a/app/src/main/java/com/london/app/navigation/graph/onboardingNavGraph.kt b/app/src/main/java/com/london/app/navigation/graph/onboardingNavGraph.kt index a3910e1f2..489c748d2 100644 --- a/app/src/main/java/com/london/app/navigation/graph/onboardingNavGraph.kt +++ b/app/src/main/java/com/london/app/navigation/graph/onboardingNavGraph.kt @@ -24,7 +24,7 @@ fun NavGraphBuilder.onboardingNavGraph( composable { WelcomeScreen( onNavigateLogin = navController::navigateToAuthGraph, - onNavigateContinue = navController::navigateToMainGraph + onNavigateContinue = navController::navigateToMainGraph ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/london/app/navigation/navExtensions.kt b/app/src/main/java/com/london/app/navigation/navExtensions.kt index 0c930ac9d..2649a1b90 100644 --- a/app/src/main/java/com/london/app/navigation/navExtensions.kt +++ b/app/src/main/java/com/london/app/navigation/navExtensions.kt @@ -44,4 +44,4 @@ inline fun NavGraphBuilder.appComposable( fun NavBackStackEntry?.hasRoute(vararg routes: Any): Boolean = routes.any { this?.destination?.hasRoute(it::class).isTrue - } \ No newline at end of file +} diff --git a/buildSrc/src/main/kotlin/com/london/buildsrc/Extensions.kt b/buildSrc/src/main/kotlin/com/london/buildsrc/Extensions.kt index 41e58b23d..083a28eb1 100644 --- a/buildSrc/src/main/kotlin/com/london/buildsrc/Extensions.kt +++ b/buildSrc/src/main/kotlin/com/london/buildsrc/Extensions.kt @@ -6,7 +6,6 @@ import java.io.FileInputStream import java.io.InputStreamReader import java.util.Properties - fun getLocalProperty(key: String, file: String? = null, root: String = "."): String { val properties = Properties() val defaultFiles = listOf("$root/local.properties", "$root/constants.properties") @@ -23,8 +22,7 @@ fun getLocalProperty(key: String, file: String? = null, root: String = "."): Str } } } - return properties.getProperty(key).toString() } -fun Project.getKey(key: String) = getLocalProperty(key, root = rootDir.path) \ No newline at end of file +fun Project.getKey(key: String) = getLocalProperty(key, root = rootDir.path) diff --git a/buildSrc/src/main/kotlin/com/london/buildsrc/GitHooks.kt b/buildSrc/src/main/kotlin/com/london/buildsrc/GitHooks.kt index ca16c0a7f..87fe0b42f 100644 --- a/buildSrc/src/main/kotlin/com/london/buildsrc/GitHooks.kt +++ b/buildSrc/src/main/kotlin/com/london/buildsrc/GitHooks.kt @@ -27,4 +27,3 @@ fun Project.installHook(sourceFile: String, targetFile: String) { println("✅ $targetFile hook up to date") } } - diff --git a/data/src/main/java/com/london/data/local/database/NovixDatabase.kt b/data/src/main/java/com/london/data/local/database/NovixDatabase.kt index a1b51bbc1..593fbf080 100644 --- a/data/src/main/java/com/london/data/local/database/NovixDatabase.kt +++ b/data/src/main/java/com/london/data/local/database/NovixDatabase.kt @@ -65,5 +65,4 @@ abstract class NovixDatabase : RoomDatabase() { abstract fun listMembershipDao(): ListMembershipDao abstract fun movieListDao(): MovieListDao abstract fun syncMetadataDao(): SyncMetadataDao - } diff --git a/data/src/main/java/com/london/data/local/database/convertor/CommonConverter.kt b/data/src/main/java/com/london/data/local/database/convertor/CommonConverter.kt index 257725519..f5b02133e 100644 --- a/data/src/main/java/com/london/data/local/database/convertor/CommonConverter.kt +++ b/data/src/main/java/com/london/data/local/database/convertor/CommonConverter.kt @@ -4,7 +4,6 @@ import androidx.room.TypeConverter import com.google.gson.Gson import com.london.data.utils.jsonList - class CommonConverter { private val gson = Gson() diff --git a/data/src/main/java/com/london/data/local/database/convertor/MediaTypeConverter.kt b/data/src/main/java/com/london/data/local/database/convertor/MediaTypeConverter.kt index 42d62f9df..8f674d216 100644 --- a/data/src/main/java/com/london/data/local/database/convertor/MediaTypeConverter.kt +++ b/data/src/main/java/com/london/data/local/database/convertor/MediaTypeConverter.kt @@ -13,4 +13,4 @@ class MediaTypeConverter { fun toMediaType(mediaType: String): MediaType { return MediaType.valueOf(mediaType) } -} \ No newline at end of file +} diff --git a/data/src/main/java/com/london/data/local/database/convertor/UpComingMovieTypeConverter.kt b/data/src/main/java/com/london/data/local/database/convertor/UpComingMovieTypeConverter.kt index 85f718e87..65b536247 100644 --- a/data/src/main/java/com/london/data/local/database/convertor/UpComingMovieTypeConverter.kt +++ b/data/src/main/java/com/london/data/local/database/convertor/UpComingMovieTypeConverter.kt @@ -17,4 +17,5 @@ class UpComingMovieTypeConverter { val listType = object : TypeToken>() {}.type return Gson().fromJson(moviesString, listType) } -} \ No newline at end of file + +} diff --git a/data/src/main/java/com/london/data/local/database/dao/customLists/MovieListDao.kt b/data/src/main/java/com/london/data/local/database/dao/customLists/MovieListDao.kt index 09a78c562..9225278a3 100644 --- a/data/src/main/java/com/london/data/local/database/dao/customLists/MovieListDao.kt +++ b/data/src/main/java/com/london/data/local/database/dao/customLists/MovieListDao.kt @@ -44,4 +44,3 @@ interface MovieListDao { @Query("DELETE FROM cached_movie_lists") suspend fun clearAll() } - diff --git a/data/src/main/java/com/london/data/local/database/dao/home/HomeDao.kt b/data/src/main/java/com/london/data/local/database/dao/home/HomeDao.kt index 8484266eb..f0969f7e0 100644 --- a/data/src/main/java/com/london/data/local/database/dao/home/HomeDao.kt +++ b/data/src/main/java/com/london/data/local/database/dao/home/HomeDao.kt @@ -1,9 +1,9 @@ package com.london.data.local.database.dao.home interface HomeDao { - suspend fun insert(item: T) suspend fun deleteAll() + suspend fun insert(item: T) suspend fun getAll(): List - suspend fun insertAll(items: List) suspend fun getByDate(date: Long): T + suspend fun insertAll(items: List) } diff --git a/data/src/main/java/com/london/data/local/database/dao/home/popular/PopularSectionDao.kt b/data/src/main/java/com/london/data/local/database/dao/home/popular/PopularSectionDao.kt index 8ffe9282a..66b539fdc 100644 --- a/data/src/main/java/com/london/data/local/database/dao/home/popular/PopularSectionDao.kt +++ b/data/src/main/java/com/london/data/local/database/dao/home/popular/PopularSectionDao.kt @@ -8,7 +8,7 @@ import com.london.data.local.database.dao.home.HomeDao import com.london.data.local.model.home.popular.PopularSectionLocal @Dao -interface PopularSectionDao: HomeDao { +interface PopularSectionDao : HomeDao { @Insert(onConflict = OnConflictStrategy.REPLACE) override suspend fun insert(item: PopularSectionLocal) @@ -24,4 +24,5 @@ interface PopularSectionDao: HomeDao { @Query("SELECT * FROM popular_section_table WHERE date = :date") override suspend fun getByDate(date: Long): PopularSectionLocal + } diff --git a/data/src/main/java/com/london/data/local/database/dao/home/upcoming/UpcomingSectionDao.kt b/data/src/main/java/com/london/data/local/database/dao/home/upcoming/UpcomingSectionDao.kt index 0d33e16d9..7be4d757e 100644 --- a/data/src/main/java/com/london/data/local/database/dao/home/upcoming/UpcomingSectionDao.kt +++ b/data/src/main/java/com/london/data/local/database/dao/home/upcoming/UpcomingSectionDao.kt @@ -7,7 +7,7 @@ import androidx.room.Query import com.london.data.local.model.home.upcoming.UpComingSectionLocal @Dao -interface UpcomingSectionDao{ +interface UpcomingSectionDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insert(item: UpComingSectionLocal) @@ -26,4 +26,5 @@ interface UpcomingSectionDao{ @Query("SELECT * FROM upcoming_section_table WHERE categoryId = :categoryId AND page = :page") suspend fun getUpComingMoviesPage(categoryId: Int?, page: Int): UpComingSectionLocal -} \ No newline at end of file + +} diff --git a/data/src/main/java/com/london/data/local/database/dao/recent/search/RecentSearchDao.kt b/data/src/main/java/com/london/data/local/database/dao/recent/search/RecentSearchDao.kt index bb34ee498..3ee1d9692 100644 --- a/data/src/main/java/com/london/data/local/database/dao/recent/search/RecentSearchDao.kt +++ b/data/src/main/java/com/london/data/local/database/dao/recent/search/RecentSearchDao.kt @@ -35,4 +35,5 @@ interface RecentSearchDao : RecentDao { @Delete suspend fun delete(item: RecentSearchLocal) + } diff --git a/data/src/main/java/com/london/data/local/database/dao/recent/viewed/RecentViewedDao.kt b/data/src/main/java/com/london/data/local/database/dao/recent/viewed/RecentViewedDao.kt index 7623c09df..817bfe3bb 100644 --- a/data/src/main/java/com/london/data/local/database/dao/recent/viewed/RecentViewedDao.kt +++ b/data/src/main/java/com/london/data/local/database/dao/recent/viewed/RecentViewedDao.kt @@ -17,7 +17,7 @@ interface RecentViewedDao : RecentDao { @Insert(onConflict = OnConflictStrategy.Companion.REPLACE) override suspend fun insert(item: RecentViewedLocal) - + @Query("SELECT * FROM recent_viewed_table ORDER BY viewDate DESC LIMIT 10") override suspend fun getRecentTen(): List @@ -35,4 +35,5 @@ interface RecentViewedDao : RecentDao { @Delete suspend fun delete(item: RecentViewedLocal) + } diff --git a/data/src/main/java/com/london/data/local/database/dao/recent/watched/movie/RecentWatchedMoviesDao.kt b/data/src/main/java/com/london/data/local/database/dao/recent/watched/movie/RecentWatchedMoviesDao.kt index 17ac95470..93efff64a 100644 --- a/data/src/main/java/com/london/data/local/database/dao/recent/watched/movie/RecentWatchedMoviesDao.kt +++ b/data/src/main/java/com/london/data/local/database/dao/recent/watched/movie/RecentWatchedMoviesDao.kt @@ -16,4 +16,5 @@ interface RecentWatchedMoviesDao : RecentWatchedDao { @Insert(onConflict = OnConflictStrategy.Companion.REPLACE) override suspend fun insert(item: RecentWatchedMovieLocal) + } diff --git a/data/src/main/java/com/london/data/local/database/dao/recent/watched/tvshow/RecentWatchedTvShowsDao.kt b/data/src/main/java/com/london/data/local/database/dao/recent/watched/tvshow/RecentWatchedTvShowsDao.kt index a60bf82c7..34c86b965 100644 --- a/data/src/main/java/com/london/data/local/database/dao/recent/watched/tvshow/RecentWatchedTvShowsDao.kt +++ b/data/src/main/java/com/london/data/local/database/dao/recent/watched/tvshow/RecentWatchedTvShowsDao.kt @@ -16,4 +16,5 @@ interface RecentWatchedTvShowsDao : RecentWatchedDao { @Insert(onConflict = OnConflictStrategy.Companion.REPLACE) override suspend fun insert(item: RecentWatchedTvShowLocal) + } diff --git a/data/src/main/java/com/london/data/local/database/dao/search/GenreInterestDao.kt b/data/src/main/java/com/london/data/local/database/dao/search/GenreInterestDao.kt index 799a5450d..2fa669aaa 100644 --- a/data/src/main/java/com/london/data/local/database/dao/search/GenreInterestDao.kt +++ b/data/src/main/java/com/london/data/local/database/dao/search/GenreInterestDao.kt @@ -21,4 +21,5 @@ interface GenreInterestDao { @Update suspend fun updateGenreInterest(genreInterest: GenreInterestEntity) + } diff --git a/data/src/main/java/com/london/data/local/model/customLists/MovieListMembershipLocal.kt b/data/src/main/java/com/london/data/local/model/customLists/MovieListMembershipLocal.kt index 5a27625bf..45cf5877d 100644 --- a/data/src/main/java/com/london/data/local/model/customLists/MovieListMembershipLocal.kt +++ b/data/src/main/java/com/london/data/local/model/customLists/MovieListMembershipLocal.kt @@ -2,8 +2,10 @@ package com.london.data.local.model.customLists import androidx.room.Entity -@Entity(tableName = "movie_list_membership", - primaryKeys = ["movieId", "listId"]) +@Entity( + tableName = "movie_list_membership", + primaryKeys = ["movieId", "listId"] +) data class MovieListMembershipLocal( val movieId: Int, val listId: Int, diff --git a/data/src/main/java/com/london/data/local/model/home/popular/PopularSectionLocal.kt b/data/src/main/java/com/london/data/local/model/home/popular/PopularSectionLocal.kt index df0cb22ea..5ea4da45b 100644 --- a/data/src/main/java/com/london/data/local/model/home/popular/PopularSectionLocal.kt +++ b/data/src/main/java/com/london/data/local/model/home/popular/PopularSectionLocal.kt @@ -5,7 +5,7 @@ import com.london.domain.entity.shared.MediaType @Entity( tableName = "popular_section_table", - primaryKeys = ["id","mediaType"] + primaryKeys = ["id", "mediaType"] ) data class PopularSectionLocal( val id: Int, diff --git a/data/src/main/java/com/london/data/local/model/home/topRated/TopRatedLocal.kt b/data/src/main/java/com/london/data/local/model/home/topRated/TopRatedLocal.kt index 50de9dd75..8dcd879d8 100644 --- a/data/src/main/java/com/london/data/local/model/home/topRated/TopRatedLocal.kt +++ b/data/src/main/java/com/london/data/local/model/home/topRated/TopRatedLocal.kt @@ -6,7 +6,7 @@ import com.london.domain.entity.shared.MediaType @Entity( tableName = "top_rated_table", - primaryKeys = ["id","mediaType"] + primaryKeys = ["id", "mediaType"] ) data class TopRatedLocal( val id: Int, @@ -15,4 +15,4 @@ data class TopRatedLocal( val mediaType: MediaType, val date: Long = System.currentTimeMillis(), val genre: List -): GenreMapper \ No newline at end of file +) : GenreMapper diff --git a/data/src/main/java/com/london/data/local/model/recent/MediaTypeLocal.kt b/data/src/main/java/com/london/data/local/model/recent/MediaTypeLocal.kt index f40142a82..fa1369200 100644 --- a/data/src/main/java/com/london/data/local/model/recent/MediaTypeLocal.kt +++ b/data/src/main/java/com/london/data/local/model/recent/MediaTypeLocal.kt @@ -3,4 +3,4 @@ package com.london.data.local.model.recent enum class MediaTypeLocal { TvShow, Movie, -} \ No newline at end of file +} diff --git a/data/src/main/java/com/london/data/local/model/recent/search/RecentSearchLocal.kt b/data/src/main/java/com/london/data/local/model/recent/search/RecentSearchLocal.kt index d58b065da..af174b52f 100644 --- a/data/src/main/java/com/london/data/local/model/recent/search/RecentSearchLocal.kt +++ b/data/src/main/java/com/london/data/local/model/recent/search/RecentSearchLocal.kt @@ -9,4 +9,4 @@ data class RecentSearchLocal( val id: Int = 0, val query: String, val date: Long -) \ No newline at end of file +) diff --git a/data/src/main/java/com/london/data/local/model/recent/viewed/RecentViewedLocal.kt b/data/src/main/java/com/london/data/local/model/recent/viewed/RecentViewedLocal.kt index 32593759c..25b50764b 100644 --- a/data/src/main/java/com/london/data/local/model/recent/viewed/RecentViewedLocal.kt +++ b/data/src/main/java/com/london/data/local/model/recent/viewed/RecentViewedLocal.kt @@ -4,11 +4,11 @@ import com.london.data.local.model.recent.MediaTypeLocal @androidx.room.Entity( tableName = "recent_viewed_table", - primaryKeys = ["id","type"] + primaryKeys = ["id", "type"] ) data class RecentViewedLocal( - val id : Int, - val imageUrl : String, - val type : MediaTypeLocal, - val viewDate : Long, + val id: Int, + val imageUrl: String, + val type: MediaTypeLocal, + val viewDate: Long, ) diff --git a/data/src/main/java/com/london/data/local/preference/AuthenticationPreferences.kt b/data/src/main/java/com/london/data/local/preference/AuthenticationPreferences.kt index 905d4f113..7a7c93ec6 100644 --- a/data/src/main/java/com/london/data/local/preference/AuthenticationPreferences.kt +++ b/data/src/main/java/com/london/data/local/preference/AuthenticationPreferences.kt @@ -52,4 +52,5 @@ class AuthenticationPreferences @Inject constructor( private const val IS_GUEST = "is_guest" private const val GUEST_SESSION_ID = "guest_session_id" } + } diff --git a/data/src/main/java/com/london/data/local/source/customLists/CustomMovieListLocalDataSource.kt b/data/src/main/java/com/london/data/local/source/customLists/CustomMovieListLocalDataSource.kt index 5822558ca..337c15dba 100644 --- a/data/src/main/java/com/london/data/local/source/customLists/CustomMovieListLocalDataSource.kt +++ b/data/src/main/java/com/london/data/local/source/customLists/CustomMovieListLocalDataSource.kt @@ -31,4 +31,4 @@ interface CustomMovieListLocalDataSource { suspend fun shouldRefreshCache(): Boolean suspend fun markCacheRefreshed(success: Boolean) suspend fun clearAllCache() -} \ No newline at end of file +} diff --git a/data/src/main/java/com/london/data/local/source/customLists/CustomMovieListLocalDataSourceImpl.kt b/data/src/main/java/com/london/data/local/source/customLists/CustomMovieListLocalDataSourceImpl.kt index 93b05b282..0a25f8400 100644 --- a/data/src/main/java/com/london/data/local/source/customLists/CustomMovieListLocalDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/local/source/customLists/CustomMovieListLocalDataSourceImpl.kt @@ -35,7 +35,7 @@ class CustomMovieListLocalDataSourceImpl @Inject constructor( membershipDao.getMovieListIdsFlow(movieId = movieId) override suspend fun getMovieIdsForList(listId: Int, limit: Int, offset: Int): List = - membershipDao.getMovieIdsForList(listId = listId, limit = limit, offset = offset) + membershipDao.getMovieIdsForList(listId = listId, limit = limit, offset = offset) override fun getMovieIdsForListFlow(listId: Int): Flow> = membershipDao.getMovieIdsForListFlow(listId = listId) @@ -109,4 +109,5 @@ class CustomMovieListLocalDataSourceImpl @Inject constructor( private companion object { const val CACHE_VALIDITY_MS = 30 * 60 * 1000L // 30 minutes } + } diff --git a/data/src/main/java/com/london/data/local/source/home/popular/PopularLocalDataSourceImpl.kt b/data/src/main/java/com/london/data/local/source/home/popular/PopularLocalDataSourceImpl.kt index 6b4391904..b48453f35 100644 --- a/data/src/main/java/com/london/data/local/source/home/popular/PopularLocalDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/local/source/home/popular/PopularLocalDataSourceImpl.kt @@ -31,7 +31,7 @@ class PopularLocalDataSourceImpl @Inject constructor( override suspend fun getByDate(date: Long): PopularSectionLocal = popularSectionDao.getByDate(date) - + private fun deleteExpiredData() { CoroutineScope(Dispatchers.IO).launch { popularSectionDao.getAll().forEach { popularLocal -> @@ -40,4 +40,5 @@ class PopularLocalDataSourceImpl @Inject constructor( } } } + } diff --git a/data/src/main/java/com/london/data/local/source/home/toprated/TopRatedDataSourceImpl.kt b/data/src/main/java/com/london/data/local/source/home/toprated/TopRatedDataSourceImpl.kt index 19108f904..0c3aa4a00 100644 --- a/data/src/main/java/com/london/data/local/source/home/toprated/TopRatedDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/local/source/home/toprated/TopRatedDataSourceImpl.kt @@ -9,7 +9,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import javax.inject.Inject -class TopRatedDataSourceImpl @Inject constructor ( +class TopRatedDataSourceImpl @Inject constructor( private val topRatedDao: TopRatedDao ) : HomeLocalDataSource { @@ -32,7 +32,7 @@ class TopRatedDataSourceImpl @Inject constructor ( override suspend fun getByDate(date: Long): TopRatedLocal = topRatedDao.getByDate(date) - + private fun deleteExpiredData() { CoroutineScope(Dispatchers.IO).launch { topRatedDao.getAll().forEach { popularLocal -> @@ -41,5 +41,5 @@ class TopRatedDataSourceImpl @Inject constructor ( } } } -} +} diff --git a/data/src/main/java/com/london/data/local/source/home/upcoming/UpComingLocalDataSource.kt b/data/src/main/java/com/london/data/local/source/home/upcoming/UpComingLocalDataSource.kt index 5d1d31cba..a352fc365 100644 --- a/data/src/main/java/com/london/data/local/source/home/upcoming/UpComingLocalDataSource.kt +++ b/data/src/main/java/com/london/data/local/source/home/upcoming/UpComingLocalDataSource.kt @@ -5,4 +5,4 @@ import com.london.data.local.model.home.upcoming.UpComingSectionLocal interface UpComingLocalDataSource { suspend fun insert(item: UpComingSectionLocal) suspend fun getUpComingMoviesPage(categoryId: Int?, page: Int): UpComingSectionLocal -} \ No newline at end of file +} diff --git a/data/src/main/java/com/london/data/local/source/home/upcoming/UpComingLocalDataSourceImpl.kt b/data/src/main/java/com/london/data/local/source/home/upcoming/UpComingLocalDataSourceImpl.kt index daf5f3a45..1e9902dce 100644 --- a/data/src/main/java/com/london/data/local/source/home/upcoming/UpComingLocalDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/local/source/home/upcoming/UpComingLocalDataSourceImpl.kt @@ -30,4 +30,5 @@ class UpComingLocalDataSourceImpl @Inject constructor( } } } + } diff --git a/data/src/main/java/com/london/data/local/source/recent/RecentSearchDataSourceImpl.kt b/data/src/main/java/com/london/data/local/source/recent/RecentSearchDataSourceImpl.kt index 30dcf8e08..a6d786be2 100644 --- a/data/src/main/java/com/london/data/local/source/recent/RecentSearchDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/local/source/recent/RecentSearchDataSourceImpl.kt @@ -36,4 +36,5 @@ class RecentSearchDataSourceImpl @Inject constructor( override suspend fun delete(item: RecentSearchLocal) = runCatching { recentSearchDao.delete(item) }.getOrDefault(Unit) + } diff --git a/data/src/main/java/com/london/data/local/source/recent/RecentViewedDataSourceImpl.kt b/data/src/main/java/com/london/data/local/source/recent/RecentViewedDataSourceImpl.kt index 14ff6fc63..70aa776ce 100644 --- a/data/src/main/java/com/london/data/local/source/recent/RecentViewedDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/local/source/recent/RecentViewedDataSourceImpl.kt @@ -35,4 +35,5 @@ class RecentViewedDataSourceImpl @Inject constructor( override suspend fun delete(item: RecentViewedLocal) = runCatching { recentViewedDao.delete(item) }.getOrDefault(Unit) + } diff --git a/data/src/main/java/com/london/data/local/source/recent/watched/RecentWatchedMoviesDataSourceImpl.kt b/data/src/main/java/com/london/data/local/source/recent/watched/RecentWatchedMoviesDataSourceImpl.kt index 8cd83fe96..f096f47dc 100644 --- a/data/src/main/java/com/london/data/local/source/recent/watched/RecentWatchedMoviesDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/local/source/recent/watched/RecentWatchedMoviesDataSourceImpl.kt @@ -19,4 +19,5 @@ class RecentWatchedMoviesDataSourceImpl @Inject constructor( recentWatchedMoviesDao.insert(item) } } + } diff --git a/data/src/main/java/com/london/data/local/source/recent/watched/RecentWatchedTvShowsDataSourceImpl.kt b/data/src/main/java/com/london/data/local/source/recent/watched/RecentWatchedTvShowsDataSourceImpl.kt index 1ffaa30a9..58baa8342 100644 --- a/data/src/main/java/com/london/data/local/source/recent/watched/RecentWatchedTvShowsDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/local/source/recent/watched/RecentWatchedTvShowsDataSourceImpl.kt @@ -19,4 +19,5 @@ class RecentWatchedTvShowsDataSourceImpl @Inject constructor( recentWatchedTvShowsDao.insert(item) } } + } diff --git a/data/src/main/java/com/london/data/mapper/account/AccountMapper.kt b/data/src/main/java/com/london/data/mapper/account/accountMapper.kt similarity index 99% rename from data/src/main/java/com/london/data/mapper/account/AccountMapper.kt rename to data/src/main/java/com/london/data/mapper/account/accountMapper.kt index aa9c08f33..3d907368a 100644 --- a/data/src/main/java/com/london/data/mapper/account/AccountMapper.kt +++ b/data/src/main/java/com/london/data/mapper/account/accountMapper.kt @@ -10,4 +10,3 @@ fun AccountInfoResponse.toEntity(): AccountInfo = AccountInfo( userName = this.name?.takeIf { it.isNotBlank() } ?: this.userName.orEmpty(), avatarPath = this.avatar?.tmdb?.avatarPath.asImageUrlOrEmpty() ) - diff --git a/data/src/main/java/com/london/data/mapper/details/AccountStatesMapper.kt b/data/src/main/java/com/london/data/mapper/details/accountStatesMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/details/AccountStatesMapper.kt rename to data/src/main/java/com/london/data/mapper/details/accountStatesMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/details/actor/ActorDetailsMapper.kt b/data/src/main/java/com/london/data/mapper/details/actor/actorDetailsMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/details/actor/ActorDetailsMapper.kt rename to data/src/main/java/com/london/data/mapper/details/actor/actorDetailsMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/details/actor/ActorImageMapper.kt b/data/src/main/java/com/london/data/mapper/details/actor/actorImageMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/details/actor/ActorImageMapper.kt rename to data/src/main/java/com/london/data/mapper/details/actor/actorImageMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/details/actor/ActorMovieDetailsMapper.kt b/data/src/main/java/com/london/data/mapper/details/actor/actorMovieDetailsMapper.kt similarity index 99% rename from data/src/main/java/com/london/data/mapper/details/actor/ActorMovieDetailsMapper.kt rename to data/src/main/java/com/london/data/mapper/details/actor/actorMovieDetailsMapper.kt index 0b404dc61..3ab33358f 100644 --- a/data/src/main/java/com/london/data/mapper/details/actor/ActorMovieDetailsMapper.kt +++ b/data/src/main/java/com/london/data/mapper/details/actor/actorMovieDetailsMapper.kt @@ -12,10 +12,8 @@ fun ActorMovieDetailsResponse.toEntity(): ActorMediaDetails = mediaItems = cast.orEmpty().map { it.toEntity() }, ) - fun ActorMovieCastMember.toEntity(): ActorMediaItems = ActorMediaItems( id = id.orZero(), posterUrl = posterPath.asImageUrlOrEmpty(), ) - diff --git a/data/src/main/java/com/london/data/mapper/details/actor/ActorTvShowDetailsMapper.kt b/data/src/main/java/com/london/data/mapper/details/actor/actorTvShowDetailsMapper.kt similarity index 99% rename from data/src/main/java/com/london/data/mapper/details/actor/ActorTvShowDetailsMapper.kt rename to data/src/main/java/com/london/data/mapper/details/actor/actorTvShowDetailsMapper.kt index ea72f7f36..7f4fd1962 100644 --- a/data/src/main/java/com/london/data/mapper/details/actor/ActorTvShowDetailsMapper.kt +++ b/data/src/main/java/com/london/data/mapper/details/actor/actorTvShowDetailsMapper.kt @@ -12,7 +12,6 @@ fun ActorTvShowDetailsResponse.toEntity(): ActorMediaDetails = mediaItems = cast?.map { it.toEntity() }.orEmpty() ) - fun ActorTvShowCastMember.toEntity(): ActorMediaItems = ActorMediaItems( id = id.orZero(), diff --git a/data/src/main/java/com/london/data/mapper/details/ImagesMapper.kt b/data/src/main/java/com/london/data/mapper/details/imagesMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/details/ImagesMapper.kt rename to data/src/main/java/com/london/data/mapper/details/imagesMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/details/movie/ActorMapper.kt b/data/src/main/java/com/london/data/mapper/details/movie/actorMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/details/movie/ActorMapper.kt rename to data/src/main/java/com/london/data/mapper/details/movie/actorMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/details/movie/MovieDetailsMapper.kt b/data/src/main/java/com/london/data/mapper/details/movie/movieDetailsMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/details/movie/MovieDetailsMapper.kt rename to data/src/main/java/com/london/data/mapper/details/movie/movieDetailsMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/details/tvshow/CastMapper.kt b/data/src/main/java/com/london/data/mapper/details/tvshow/castMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/details/tvshow/CastMapper.kt rename to data/src/main/java/com/london/data/mapper/details/tvshow/castMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/details/tvshow/EpisodesEntity.kt b/data/src/main/java/com/london/data/mapper/details/tvshow/episodesEntity.kt similarity index 99% rename from data/src/main/java/com/london/data/mapper/details/tvshow/EpisodesEntity.kt rename to data/src/main/java/com/london/data/mapper/details/tvshow/episodesEntity.kt index 0a1072288..1c1388eaf 100644 --- a/data/src/main/java/com/london/data/mapper/details/tvshow/EpisodesEntity.kt +++ b/data/src/main/java/com/london/data/mapper/details/tvshow/episodesEntity.kt @@ -53,4 +53,3 @@ fun EpisodeGuestStar.toActorEntity(): Actor = profilePictureUrl = profilePath.asImageUrlOrEmpty(), characterName = character.orEmpty() ) - diff --git a/data/src/main/java/com/london/data/mapper/details/tvshow/TvShowDetailsMapper.kt b/data/src/main/java/com/london/data/mapper/details/tvshow/tvShowDetailsMapper.kt similarity index 99% rename from data/src/main/java/com/london/data/mapper/details/tvshow/TvShowDetailsMapper.kt rename to data/src/main/java/com/london/data/mapper/details/tvshow/tvShowDetailsMapper.kt index 58ecb3e17..5c4147d9b 100644 --- a/data/src/main/java/com/london/data/mapper/details/tvshow/TvShowDetailsMapper.kt +++ b/data/src/main/java/com/london/data/mapper/details/tvshow/tvShowDetailsMapper.kt @@ -18,4 +18,3 @@ fun TvShowDetailsRemoteResponse.toEntity() = TvShowDetails( tvShowSeasons = tvShowSeasons.orEmpty().map { it.seasonNumber.orZero() }, voteAverage = voteAverage.orZero().roundToDecimal(), ) - diff --git a/data/src/main/java/com/london/data/mapper/genre/toGenreId.kt b/data/src/main/java/com/london/data/mapper/genre/genreIdMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/genre/toGenreId.kt rename to data/src/main/java/com/london/data/mapper/genre/genreIdMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/home/popular/PopularMovieMapper.kt b/data/src/main/java/com/london/data/mapper/home/popular/popularMovieMapper.kt similarity index 99% rename from data/src/main/java/com/london/data/mapper/home/popular/PopularMovieMapper.kt rename to data/src/main/java/com/london/data/mapper/home/popular/popularMovieMapper.kt index 1176fd64f..60392cd03 100644 --- a/data/src/main/java/com/london/data/mapper/home/popular/PopularMovieMapper.kt +++ b/data/src/main/java/com/london/data/mapper/home/popular/popularMovieMapper.kt @@ -17,7 +17,6 @@ fun PopularMovieResponse.toPopularMovie(): PopularMedia = PopularMedia( mediaType = MediaType.Movie ) - fun ApiResponse.toPopularMovies(): List = items.map { it.toPopularMovie() } diff --git a/data/src/main/java/com/london/data/mapper/home/popular/PopularTvShowMapper.kt b/data/src/main/java/com/london/data/mapper/home/popular/popularTvShowMapper.kt similarity index 99% rename from data/src/main/java/com/london/data/mapper/home/popular/PopularTvShowMapper.kt rename to data/src/main/java/com/london/data/mapper/home/popular/popularTvShowMapper.kt index e0a8cbdb2..af99b495f 100644 --- a/data/src/main/java/com/london/data/mapper/home/popular/PopularTvShowMapper.kt +++ b/data/src/main/java/com/london/data/mapper/home/popular/popularTvShowMapper.kt @@ -18,7 +18,6 @@ fun PopularTvShowResponse.toTvShowEntity(): PopularMedia = mediaType = MediaType.TvShow ) - fun ApiResponse.toPopularTvShows(): List = items.map { it.toTvShowEntity() } diff --git a/data/src/main/java/com/london/data/mapper/home/toprated/TopRatedMediaLocalMapper.kt b/data/src/main/java/com/london/data/mapper/home/toprated/topRatedMediaLocalMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/home/toprated/TopRatedMediaLocalMapper.kt rename to data/src/main/java/com/london/data/mapper/home/toprated/topRatedMediaLocalMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/home/toprated/TopRatedMovieMapper.kt b/data/src/main/java/com/london/data/mapper/home/toprated/topRatedMovieMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/home/toprated/TopRatedMovieMapper.kt rename to data/src/main/java/com/london/data/mapper/home/toprated/topRatedMovieMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/home/toprated/TopRatedTvSeriesMapper.kt b/data/src/main/java/com/london/data/mapper/home/toprated/topRatedTvSeriesMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/home/toprated/TopRatedTvSeriesMapper.kt rename to data/src/main/java/com/london/data/mapper/home/toprated/topRatedTvSeriesMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/home/trending/TrendingActorMapper.kt b/data/src/main/java/com/london/data/mapper/home/trending/actorTrendingMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/home/trending/TrendingActorMapper.kt rename to data/src/main/java/com/london/data/mapper/home/trending/actorTrendingMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/home/trending/MediaTrendingMapper.kt b/data/src/main/java/com/london/data/mapper/home/trending/mediaTrendingMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/home/trending/MediaTrendingMapper.kt rename to data/src/main/java/com/london/data/mapper/home/trending/mediaTrendingMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/myrating/RatingMapper.kt b/data/src/main/java/com/london/data/mapper/myrating/ratingMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/myrating/RatingMapper.kt rename to data/src/main/java/com/london/data/mapper/myrating/ratingMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/recent/RecentSearchMapper.kt b/data/src/main/java/com/london/data/mapper/recent/recentSearchMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/recent/RecentSearchMapper.kt rename to data/src/main/java/com/london/data/mapper/recent/recentSearchMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/recent/recentViewedMapper.kt b/data/src/main/java/com/london/data/mapper/recent/recentViewedMapper.kt index c55916ff2..93c342348 100644 --- a/data/src/main/java/com/london/data/mapper/recent/recentViewedMapper.kt +++ b/data/src/main/java/com/london/data/mapper/recent/recentViewedMapper.kt @@ -24,4 +24,3 @@ fun MediaTypeLocal.toEntity(): MediaType = fun MediaType.toLocal(): MediaTypeLocal = if (this == MediaType.Movie) MediaTypeLocal.Movie else MediaTypeLocal.TvShow - diff --git a/data/src/main/java/com/london/data/mapper/recent/recentWatchedMapper.kt b/data/src/main/java/com/london/data/mapper/recent/recentWatchedMapper.kt index 28c63fca9..2568e76f8 100644 --- a/data/src/main/java/com/london/data/mapper/recent/recentWatchedMapper.kt +++ b/data/src/main/java/com/london/data/mapper/recent/recentWatchedMapper.kt @@ -6,7 +6,6 @@ import com.london.data.mapper.genre.getId import com.london.domain.entity.movie.Movie import com.london.domain.entity.tvshow.TvShow - fun RecentWatchedMovieLocal.toEntity() = Movie( id = id, name = name, diff --git a/data/src/main/java/com/london/data/mapper/search/ActorMapper.kt b/data/src/main/java/com/london/data/mapper/search/actorMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/search/ActorMapper.kt rename to data/src/main/java/com/london/data/mapper/search/actorMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/search/MovieMapper.kt b/data/src/main/java/com/london/data/mapper/search/movieMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/search/MovieMapper.kt rename to data/src/main/java/com/london/data/mapper/search/movieMapper.kt diff --git a/data/src/main/java/com/london/data/mapper/search/ReviewsMapper.kt b/data/src/main/java/com/london/data/mapper/search/reviewsMapper.kt similarity index 99% rename from data/src/main/java/com/london/data/mapper/search/ReviewsMapper.kt rename to data/src/main/java/com/london/data/mapper/search/reviewsMapper.kt index 9ed510f6a..a95dc5f8a 100644 --- a/data/src/main/java/com/london/data/mapper/search/ReviewsMapper.kt +++ b/data/src/main/java/com/london/data/mapper/search/reviewsMapper.kt @@ -33,4 +33,4 @@ fun AuthorDetailsResponse.toAuthorDetails(): AuthorDetails = username = authorUsername.orEmpty(), profileUrl = authorPictureUrl.asImageUrlOrEmpty(), rating = rating.orZero() - ) \ No newline at end of file + ) diff --git a/data/src/main/java/com/london/data/mapper/search/TvMapper.kt b/data/src/main/java/com/london/data/mapper/search/tvMapper.kt similarity index 100% rename from data/src/main/java/com/london/data/mapper/search/TvMapper.kt rename to data/src/main/java/com/london/data/mapper/search/tvMapper.kt diff --git a/data/src/main/java/com/london/data/remote/interceptor/AuthenticationInterceptor.kt b/data/src/main/java/com/london/data/remote/interceptor/AuthenticationInterceptor.kt index 83b53b862..c47012ef5 100644 --- a/data/src/main/java/com/london/data/remote/interceptor/AuthenticationInterceptor.kt +++ b/data/src/main/java/com/london/data/remote/interceptor/AuthenticationInterceptor.kt @@ -15,4 +15,4 @@ class AuthenticationInterceptor @Inject constructor( } return chain.proceed(builder.build()) } -} \ No newline at end of file +} diff --git a/data/src/main/java/com/london/data/remote/model/ApiConstants.kt b/data/src/main/java/com/london/data/remote/model/ApiConstants.kt index 13d9e4385..c2e6af7bf 100644 --- a/data/src/main/java/com/london/data/remote/model/ApiConstants.kt +++ b/data/src/main/java/com/london/data/remote/model/ApiConstants.kt @@ -1,6 +1,7 @@ package com.london.data.remote.model object ApiConstants { + const val SEARCH_PATH_MOVIES = "search/movie" const val SEARCH_PATH_TVS = "search/tv" const val SEARCH_PATH_ACTORS = "search/person" diff --git a/data/src/main/java/com/london/data/remote/model/ApiResponse.kt b/data/src/main/java/com/london/data/remote/model/ApiResponse.kt index d03d698b0..5960ed313 100644 --- a/data/src/main/java/com/london/data/remote/model/ApiResponse.kt +++ b/data/src/main/java/com/london/data/remote/model/ApiResponse.kt @@ -13,4 +13,4 @@ data class ApiResponse( val totalPages: Int, @SerialName("total_results") val totalItems: Int -) \ No newline at end of file +) diff --git a/data/src/main/java/com/london/data/remote/model/account/AccountInfoResponse.kt b/data/src/main/java/com/london/data/remote/model/account/AccountInfoResponse.kt index 7126b1fd9..d766e73ab 100644 --- a/data/src/main/java/com/london/data/remote/model/account/AccountInfoResponse.kt +++ b/data/src/main/java/com/london/data/remote/model/account/AccountInfoResponse.kt @@ -14,5 +14,3 @@ data class AccountInfoResponse( @SerialName("avatar") val avatar: AvatarInfo? = null ) - - diff --git a/data/src/main/java/com/london/data/remote/model/authentication/GuestSessionResponse.kt b/data/src/main/java/com/london/data/remote/model/authentication/GuestSessionResponse.kt index 2812b41b8..90850376c 100644 --- a/data/src/main/java/com/london/data/remote/model/authentication/GuestSessionResponse.kt +++ b/data/src/main/java/com/london/data/remote/model/authentication/GuestSessionResponse.kt @@ -11,4 +11,4 @@ data class GuestSessionResponse( val guestSessionId: String? = null, @SerialName("expires_at") val expiresAt: String? = null -) \ No newline at end of file +) diff --git a/data/src/main/java/com/london/data/remote/model/authentication/LoginRequest.kt b/data/src/main/java/com/london/data/remote/model/authentication/LoginRequest.kt index 3d6a2e6fa..82f3b06db 100644 --- a/data/src/main/java/com/london/data/remote/model/authentication/LoginRequest.kt +++ b/data/src/main/java/com/london/data/remote/model/authentication/LoginRequest.kt @@ -11,4 +11,4 @@ data class LoginRequest( val password: String? = null, @SerialName("request_token") val requestToken: String? = null -) \ No newline at end of file +) diff --git a/data/src/main/java/com/london/data/remote/model/authentication/RequestToken.kt b/data/src/main/java/com/london/data/remote/model/authentication/RequestToken.kt index 3cf2cbd36..753039d09 100644 --- a/data/src/main/java/com/london/data/remote/model/authentication/RequestToken.kt +++ b/data/src/main/java/com/london/data/remote/model/authentication/RequestToken.kt @@ -7,4 +7,4 @@ import kotlinx.serialization.Serializable data class RequestToken( @SerialName("request_token") val requestToken: String? = null -) \ No newline at end of file +) diff --git a/data/src/main/java/com/london/data/remote/model/authentication/RequestTokenResponse.kt b/data/src/main/java/com/london/data/remote/model/authentication/RequestTokenResponse.kt index ed51cb43e..11bf13fa2 100644 --- a/data/src/main/java/com/london/data/remote/model/authentication/RequestTokenResponse.kt +++ b/data/src/main/java/com/london/data/remote/model/authentication/RequestTokenResponse.kt @@ -11,4 +11,4 @@ data class RequestTokenResponse( val expiresAt: String? = null, @SerialName("request_token") val requestToken: String? = null -) \ No newline at end of file +) diff --git a/data/src/main/java/com/london/data/remote/model/authentication/SessionId.kt b/data/src/main/java/com/london/data/remote/model/authentication/SessionId.kt index 6bd1dfe82..31901363d 100644 --- a/data/src/main/java/com/london/data/remote/model/authentication/SessionId.kt +++ b/data/src/main/java/com/london/data/remote/model/authentication/SessionId.kt @@ -7,4 +7,4 @@ import kotlinx.serialization.Serializable data class SessionId( @SerialName("session_id") val sessionId: String? = null -) \ No newline at end of file +) diff --git a/data/src/main/java/com/london/data/remote/model/details/rating/RatingRemoteResponse.kt b/data/src/main/java/com/london/data/remote/model/details/rating/RatingRemoteResponse.kt index b8ff3a437..b896bf778 100644 --- a/data/src/main/java/com/london/data/remote/model/details/rating/RatingRemoteResponse.kt +++ b/data/src/main/java/com/london/data/remote/model/details/rating/RatingRemoteResponse.kt @@ -12,4 +12,4 @@ data class RatingRemoteResponse( val statusMessage: String? = null, @SerialName("success") val success: Boolean? = null -) \ No newline at end of file +) diff --git a/data/src/main/java/com/london/data/remote/model/details/videoprovider/VideoResponse.kt b/data/src/main/java/com/london/data/remote/model/details/videoprovider/VideoResponse.kt index 2f7b19b49..5547bf965 100644 --- a/data/src/main/java/com/london/data/remote/model/details/videoprovider/VideoResponse.kt +++ b/data/src/main/java/com/london/data/remote/model/details/videoprovider/VideoResponse.kt @@ -9,4 +9,4 @@ data class VideoResponse( val id: Int? = null, @SerialName("results") val videos: List? = null -) \ No newline at end of file +) diff --git a/data/src/main/java/com/london/data/remote/model/myrating/RatingMediaResponse.kt b/data/src/main/java/com/london/data/remote/model/myrating/RatingMediaResponse.kt index a58a1dad1..d0625f1c6 100644 --- a/data/src/main/java/com/london/data/remote/model/myrating/RatingMediaResponse.kt +++ b/data/src/main/java/com/london/data/remote/model/myrating/RatingMediaResponse.kt @@ -13,4 +13,4 @@ data class RatingMediaResponse( val title: String? = null, @SerialName("rating") val rating: Double? = null -) \ No newline at end of file +) diff --git a/data/src/main/java/com/london/data/remote/model/toprated/TopRatedMovieRemote.kt b/data/src/main/java/com/london/data/remote/model/toprated/TopRatedMovieRemote.kt index 4c856c6e6..3b118e463 100644 --- a/data/src/main/java/com/london/data/remote/model/toprated/TopRatedMovieRemote.kt +++ b/data/src/main/java/com/london/data/remote/model/toprated/TopRatedMovieRemote.kt @@ -14,7 +14,7 @@ data class TopRatedMovieRemote( @SerialName("poster_path") val posterPath: String? = null, @SerialName("release_date") - val releaseDate: String? = null , + val releaseDate: String? = null, @SerialName("title") val title: String? = null, ) : GenreMapper diff --git a/data/src/main/java/com/london/data/remote/service/account/AccountApiService.kt b/data/src/main/java/com/london/data/remote/service/account/AccountApiService.kt index 582d502a8..d81fdb8e7 100644 --- a/data/src/main/java/com/london/data/remote/service/account/AccountApiService.kt +++ b/data/src/main/java/com/london/data/remote/service/account/AccountApiService.kt @@ -7,8 +7,10 @@ import retrofit2.http.GET import retrofit2.http.Query interface AccountApiService { + @GET(ApiConstants.GET_ACCOUNT_DETAILS) suspend fun getAccountDetails( @Query("session_id") sessionId: String ): Response + } diff --git a/data/src/main/java/com/london/data/remote/service/authentication/AuthenticationApiService.kt b/data/src/main/java/com/london/data/remote/service/authentication/AuthenticationApiService.kt index 4ca93cdfb..9bc064ab1 100644 --- a/data/src/main/java/com/london/data/remote/service/authentication/AuthenticationApiService.kt +++ b/data/src/main/java/com/london/data/remote/service/authentication/AuthenticationApiService.kt @@ -19,6 +19,7 @@ import retrofit2.http.HTTP import retrofit2.http.POST interface AuthenticationApiService { + @GET(CREATE_NEW_TOKEN) suspend fun createRequestToken(): Response @@ -39,4 +40,5 @@ interface AuthenticationApiService { suspend fun validateLoginCredentials( @Body request: LoginRequest ): Response -} \ No newline at end of file + +} diff --git a/data/src/main/java/com/london/data/remote/service/list/CustomMovieListsApiService.kt b/data/src/main/java/com/london/data/remote/service/list/CustomMovieListsApiService.kt index 9b9dbe3ce..0d231631f 100644 --- a/data/src/main/java/com/london/data/remote/service/list/CustomMovieListsApiService.kt +++ b/data/src/main/java/com/london/data/remote/service/list/CustomMovieListsApiService.kt @@ -55,4 +55,5 @@ interface CustomMovieListsApiService { @Query("session_id") sessionId: String?, @Query("page") page: Int ): Response> + } diff --git a/data/src/main/java/com/london/data/remote/service/movie/MovieApiService.kt b/data/src/main/java/com/london/data/remote/service/movie/MovieApiService.kt index 3542ee69f..b01ce3f42 100644 --- a/data/src/main/java/com/london/data/remote/service/movie/MovieApiService.kt +++ b/data/src/main/java/com/london/data/remote/service/movie/MovieApiService.kt @@ -73,7 +73,7 @@ interface MovieApiService { @GET(ApiConstants.MOVIE_DISCOVER_PATH) suspend fun getUpComingMoviesByCategory( - @Query("with_genres") genreId: Int?=null, + @Query("with_genres") genreId: Int? = null, @Query("primary_release_date.gte") releaseDate: String, @Query("sort_by") sortBy: String = "primary_release_date.asc", @Query("page") page: Int, @@ -110,4 +110,5 @@ interface MovieApiService { suspend fun getTopRatedMovies( @Query("page") pageNumber: Int, ): Response> + } diff --git a/data/src/main/java/com/london/data/remote/service/tvshow/TvShowApiService.kt b/data/src/main/java/com/london/data/remote/service/tvshow/TvShowApiService.kt index c7590724f..fd400810e 100644 --- a/data/src/main/java/com/london/data/remote/service/tvshow/TvShowApiService.kt +++ b/data/src/main/java/com/london/data/remote/service/tvshow/TvShowApiService.kt @@ -139,4 +139,5 @@ interface TvShowApiService { suspend fun getTopRatedTvShows( @Query("page") pageNumber: Int, ): Response> + } diff --git a/data/src/main/java/com/london/data/remote/source/account/AccountRemoteDataSourceImpl.kt b/data/src/main/java/com/london/data/remote/source/account/AccountRemoteDataSourceImpl.kt index 994b3715f..31976419c 100644 --- a/data/src/main/java/com/london/data/remote/source/account/AccountRemoteDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/remote/source/account/AccountRemoteDataSourceImpl.kt @@ -9,7 +9,7 @@ class AccountRemoteDataSourceImpl @Inject constructor( private val accountApiService: AccountApiService ) : AccountRemoteDataSource, BaseRemoteDatasource { override suspend fun getAccountDetails(sessionId: String): Result = callApi( - apiCall = { accountApiService.getAccountDetails(sessionId) }, - mapper = { it } - ) + apiCall = { accountApiService.getAccountDetails(sessionId) }, + mapper = { it } + ) } diff --git a/data/src/main/java/com/london/data/remote/source/actor/ActorRemoteDataSourceImpl.kt b/data/src/main/java/com/london/data/remote/source/actor/ActorRemoteDataSourceImpl.kt index d02f07804..8384222dc 100644 --- a/data/src/main/java/com/london/data/remote/source/actor/ActorRemoteDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/remote/source/actor/ActorRemoteDataSourceImpl.kt @@ -13,27 +13,30 @@ import javax.inject.Inject class ActorRemoteDataSourceImpl @Inject constructor( private val actorApiService: ActorApiService, ) : ActorRemoteDataSource, BaseRemoteDatasource { + override suspend fun getActorDetailsById(id: Int): Result = callApiWithRetry( - apiCall = { actorApiService.getActorDetails(actorId = id) }, - mapper = { it } - ) + apiCall = { actorApiService.getActorDetails(actorId = id) }, + mapper = { it } + ) override suspend fun getActorImagePathById(id: Int): Result = callApiWithRetry( - apiCall = { actorApiService.getActorImages(actorId = id) }, - mapper = { it } - ) + apiCall = { actorApiService.getActorImages(actorId = id) }, + mapper = { it } + ) - override suspend fun getTrendingActors(page: Int): Result> = callApiWithRetry( + override suspend fun getTrendingActors(page: Int): Result> = + callApiWithRetry( apiCall = { actorApiService.getTrendingActors(page = page) }, mapper = { it } ) override suspend fun getMovieActors(movieId: Int): Result = callApiWithRetry( - apiCall = { actorApiService.getMovieActors(movieId = movieId) }, - mapper = { it }) + apiCall = { actorApiService.getMovieActors(movieId = movieId) }, + mapper = { it }) override suspend fun getTvShowActors(tvShowId: Int): Result = callApiWithRetry( - apiCall = { actorApiService.getTvShowActors(tvShowId = tvShowId) }, - mapper = { it } - ) + apiCall = { actorApiService.getTvShowActors(tvShowId = tvShowId) }, + mapper = { it } + ) + } diff --git a/data/src/main/java/com/london/data/remote/source/authentication/AuthenticationRemoteDataSource.kt b/data/src/main/java/com/london/data/remote/source/authentication/AuthenticationRemoteDataSource.kt index fec16d2d3..ce010b36c 100644 --- a/data/src/main/java/com/london/data/remote/source/authentication/AuthenticationRemoteDataSource.kt +++ b/data/src/main/java/com/london/data/remote/source/authentication/AuthenticationRemoteDataSource.kt @@ -1,17 +1,23 @@ package com.london.data.remote.source.authentication + import com.london.data.remote.model.authentication.DeleteSessionResponse import com.london.data.remote.model.authentication.GuestSessionResponse import com.london.data.remote.model.authentication.RequestTokenResponse import com.london.data.remote.model.authentication.SessionResponse interface AuthenticationRemoteDataSource { + suspend fun createRequestToken(): Result + suspend fun createGuestSession(): Result + suspend fun createSession(requestToken: String): Result + suspend fun validateLoginCredentials( username: String, password: String, requestToken: String ): Result + suspend fun deleteSession(sessionId: String): Result -} \ No newline at end of file +} diff --git a/data/src/main/java/com/london/data/remote/source/authentication/AuthenticationRemoteDataSourceImpl.kt b/data/src/main/java/com/london/data/remote/source/authentication/AuthenticationRemoteDataSourceImpl.kt index 609281604..b4581384e 100644 --- a/data/src/main/java/com/london/data/remote/source/authentication/AuthenticationRemoteDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/remote/source/authentication/AuthenticationRemoteDataSourceImpl.kt @@ -1,6 +1,5 @@ package com.london.data.remote.source.authentication - import com.london.data.remote.model.authentication.DeleteSessionResponse import com.london.data.remote.model.authentication.GuestSessionResponse import com.london.data.remote.model.authentication.LoginRequest @@ -17,41 +16,42 @@ class AuthenticationRemoteDataSourceImpl @Inject constructor( ) : AuthenticationRemoteDataSource, BaseRemoteDatasource { override suspend fun createRequestToken(): Result = callApi( - apiCall = { authenticationApiService.createRequestToken() }, - mapper = { it } - ) + apiCall = { authenticationApiService.createRequestToken() }, + mapper = { it } + ) override suspend fun createGuestSession(): Result = callApi( - apiCall = { authenticationApiService.createGuestSession() }, - mapper = { it } - ) + apiCall = { authenticationApiService.createGuestSession() }, + mapper = { it } + ) override suspend fun createSession(requestToken: String): Result = callApi( - apiCall = { authenticationApiService.createSession(RequestToken(requestToken)) }, - mapper = { it } - ) + apiCall = { authenticationApiService.createSession(RequestToken(requestToken)) }, + mapper = { it } + ) override suspend fun validateLoginCredentials( username: String, password: String, requestToken: String ): Result = callApi( - apiCall = { - authenticationApiService.validateLoginCredentials( - LoginRequest( - username = username, - password = password, - requestToken = requestToken - ) + apiCall = { + authenticationApiService.validateLoginCredentials( + LoginRequest( + username = username, + password = password, + requestToken = requestToken ) - }, - mapper = { it } - ) + ) + }, + mapper = { it } + ) override suspend fun deleteSession( sessionId: String ): Result = callApi( - apiCall = { authenticationApiService.deleteSession(SessionId(sessionId)) }, - mapper = { it } - ) + apiCall = { authenticationApiService.deleteSession(SessionId(sessionId)) }, + mapper = { it } + ) + } diff --git a/data/src/main/java/com/london/data/remote/source/base/BaseRemoteDataSource.kt b/data/src/main/java/com/london/data/remote/source/base/BaseRemoteDataSource.kt index 4438ebe18..bf8a28dbc 100644 --- a/data/src/main/java/com/london/data/remote/source/base/BaseRemoteDataSource.kt +++ b/data/src/main/java/com/london/data/remote/source/base/BaseRemoteDataSource.kt @@ -8,7 +8,6 @@ import kotlinx.coroutines.delay import retrofit2.Response import java.net.HttpURLConnection - interface BaseRemoteDatasource { suspend fun callApi( @@ -69,15 +68,14 @@ interface BaseRemoteDatasource { } private fun Response<*>.isServerError(): Boolean = code() in 500..599 + private fun Response<*>.isUnauthorizedError() = code() == HttpURLConnection.HTTP_UNAUTHORIZED private fun Response<*>.isValidationError(): Boolean = code() == 422 private fun Response<*>.isTimeoutError(): Boolean = when (code()) { - HttpURLConnection.HTTP_CLIENT_TIMEOUT, HttpURLConnection.HTTP_GATEWAY_TIMEOUT -> true - else -> false } @@ -96,4 +94,5 @@ interface BaseRemoteDatasource { message = errorBody()?.string(), code = code() ) + } diff --git a/data/src/main/java/com/london/data/remote/source/list/CustomMovieListsRemoteDataSource.kt b/data/src/main/java/com/london/data/remote/source/list/CustomMovieListsRemoteDataSource.kt index f352fc35b..071afe967 100644 --- a/data/src/main/java/com/london/data/remote/source/list/CustomMovieListsRemoteDataSource.kt +++ b/data/src/main/java/com/london/data/remote/source/list/CustomMovieListsRemoteDataSource.kt @@ -13,7 +13,9 @@ interface CustomMovieListsRemoteDataSource { sessionId: String?, languageCode: String ): Result + suspend fun delete(listId: Int, sessionId: String?): Result + suspend fun getDetails( listId: Int, page: Int @@ -35,4 +37,5 @@ interface CustomMovieListsRemoteDataSource { movieId: Int, sessionId: String? ): Result + } diff --git a/data/src/main/java/com/london/data/remote/source/list/CustomMovieListsRemoteDataSourceImpl.kt b/data/src/main/java/com/london/data/remote/source/list/CustomMovieListsRemoteDataSourceImpl.kt index 89fdf7e34..ea6aba1ac 100644 --- a/data/src/main/java/com/london/data/remote/source/list/CustomMovieListsRemoteDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/remote/source/list/CustomMovieListsRemoteDataSourceImpl.kt @@ -89,7 +89,6 @@ class CustomMovieListsRemoteDataSourceImpl @Inject constructor( }, mapper = { it }) - override suspend fun getAllMovieLists( page: Int, sessionId: String? @@ -102,4 +101,5 @@ class CustomMovieListsRemoteDataSourceImpl @Inject constructor( }, mapper = { it } ) + } diff --git a/data/src/main/java/com/london/data/remote/source/movie/MovieRemoteDataSource.kt b/data/src/main/java/com/london/data/remote/source/movie/MovieRemoteDataSource.kt index 2f5717ea5..e97fc7b56 100644 --- a/data/src/main/java/com/london/data/remote/source/movie/MovieRemoteDataSource.kt +++ b/data/src/main/java/com/london/data/remote/source/movie/MovieRemoteDataSource.kt @@ -16,15 +16,24 @@ import com.london.data.remote.model.trending.TrendingResponse interface MovieRemoteDataSource { suspend fun getMovieDetails(movieId: Int): Result + suspend fun getSimilarMovies(movieId: Int): Result> + suspend fun getMovieImages(movieId: Int): Result + suspend fun getMovieVideos(movieId: Int): Result + suspend fun getPopularMovies(): Result> + suspend fun getTrendingMovies(page: Int): Result> + suspend fun getMovieReviews(movieId: Int, pageNumber: Int): Result> + suspend fun getTopRatedMovies(pageNumber: Int): Result> + suspend fun getActorMovieById(id: Int): Result - suspend fun deleteMovieRating(movieId: Int , sessionId: String?): Result + + suspend fun deleteMovieRating(movieId: Int, sessionId: String?): Result suspend fun addMovieRating( movieId: Int, @@ -52,4 +61,5 @@ interface MovieRemoteDataSource { movieId: Int, userSessionId: String? ): Result + } diff --git a/data/src/main/java/com/london/data/remote/source/movie/MovieRemoteDataSourceImpl.kt b/data/src/main/java/com/london/data/remote/source/movie/MovieRemoteDataSourceImpl.kt index 66bd5bb5b..e56d4f436 100644 --- a/data/src/main/java/com/london/data/remote/source/movie/MovieRemoteDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/remote/source/movie/MovieRemoteDataSourceImpl.kt @@ -180,4 +180,5 @@ class MovieRemoteDataSourceImpl @Inject constructor( mapper = { it } ) } + } diff --git a/data/src/main/java/com/london/data/remote/source/search/SearchRemoteDataSourceImpl.kt b/data/src/main/java/com/london/data/remote/source/search/SearchRemoteDataSourceImpl.kt index 952162efe..170dc3a7a 100644 --- a/data/src/main/java/com/london/data/remote/source/search/SearchRemoteDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/remote/source/search/SearchRemoteDataSourceImpl.kt @@ -56,4 +56,5 @@ class SearchRemoteDataSourceImpl @Inject constructor( }, mapper = { it } ) + } diff --git a/data/src/main/java/com/london/data/remote/source/tvshow/TvShowRemoteDataSourceImpl.kt b/data/src/main/java/com/london/data/remote/source/tvshow/TvShowRemoteDataSourceImpl.kt index bb2e3a8f2..c3212b22a 100644 --- a/data/src/main/java/com/london/data/remote/source/tvshow/TvShowRemoteDataSourceImpl.kt +++ b/data/src/main/java/com/london/data/remote/source/tvshow/TvShowRemoteDataSourceImpl.kt @@ -246,4 +246,5 @@ class TvShowRemoteDataSourceImpl @Inject constructor( }, mapper = { it } ) + } diff --git a/data/src/main/java/com/london/data/repository/account/AccountRepositoryImpl.kt b/data/src/main/java/com/london/data/repository/account/AccountRepositoryImpl.kt index 626c4bd0f..875cc5d68 100644 --- a/data/src/main/java/com/london/data/repository/account/AccountRepositoryImpl.kt +++ b/data/src/main/java/com/london/data/repository/account/AccountRepositoryImpl.kt @@ -11,6 +11,7 @@ class AccountRepositoryImpl @Inject constructor( private val accountRemoteDataSource: AccountRemoteDataSource, private val authenticationPreferences: AuthenticationPreferences ) : AccountRepository { + override suspend fun getAccountInfo(): AccountInfo = authenticationPreferences.getSessionId()?.let { sessionId -> accountRemoteDataSource.getAccountDetails(sessionId) diff --git a/data/src/main/java/com/london/data/repository/actor/ActorRepositoryImpl.kt b/data/src/main/java/com/london/data/repository/actor/ActorRepositoryImpl.kt index 138502deb..d0261ac07 100644 --- a/data/src/main/java/com/london/data/repository/actor/ActorRepositoryImpl.kt +++ b/data/src/main/java/com/london/data/repository/actor/ActorRepositoryImpl.kt @@ -40,4 +40,5 @@ class ActorRepositoryImpl @Inject constructor( override suspend fun getTvShowActors(id: Int): TvShowCast = dataSource.getTvShowActors(id).getOrThrow().toCastEntity() + } diff --git a/data/src/main/java/com/london/data/repository/authentication/AuthenticationRepositoryImpl.kt b/data/src/main/java/com/london/data/repository/authentication/AuthenticationRepositoryImpl.kt index a2fd1e7bd..39b88f44b 100644 --- a/data/src/main/java/com/london/data/repository/authentication/AuthenticationRepositoryImpl.kt +++ b/data/src/main/java/com/london/data/repository/authentication/AuthenticationRepositoryImpl.kt @@ -17,22 +17,19 @@ class AuthenticationRepositoryImpl @Inject constructor( private val authenticationPreferences: AuthenticationPreferences, private val customMovieListLocalDataSource: CustomMovieListLocalDataSource ) : AuthenticationRepository { - override suspend fun login(username: String, password: String): Boolean { + override suspend fun login(username: String, password: String): Boolean { val sessionResponse = attemptLogin( username = username, password = password ) - if (sessionResponse.isFailure()) return false - val createdSession = createSession(sessionResponse) saveUserSession( username = username, session = createdSession, requestToken = sessionResponse.requestToken.orEmpty() ) - getUserAccount(session = createdSession) return true } @@ -104,4 +101,5 @@ class AuthenticationRepositoryImpl @Inject constructor( private fun saveUserAccount(id: Int) { authenticationPreferences.saveAccountId(id) } + } diff --git a/data/src/main/java/com/london/data/repository/movie/MovieRepositoryImpl.kt b/data/src/main/java/com/london/data/repository/movie/MovieRepositoryImpl.kt index 856d7f2c3..b9d08286b 100644 --- a/data/src/main/java/com/london/data/repository/movie/MovieRepositoryImpl.kt +++ b/data/src/main/java/com/london/data/repository/movie/MovieRepositoryImpl.kt @@ -62,7 +62,6 @@ class MovieRepositoryImpl @Inject constructor( override suspend fun getSimilarMoviesById(id: Int) = movieRemoteDataSource.getSimilarMovies(id).getOrThrow().items.map { it.toEntity() } - override suspend fun getMovieVideos(movieId: Int): List { return movieRemoteDataSource.getMovieVideos(movieId) .getOrThrow().videos.orEmpty().map { movieVideoRemote -> @@ -248,4 +247,5 @@ class MovieRepositoryImpl @Inject constructor( companion object { const val PAGE_NUMBER = 1 } + } diff --git a/data/src/main/java/com/london/data/repository/recent/RecentSearchRepositoryImpl.kt b/data/src/main/java/com/london/data/repository/recent/RecentSearchRepositoryImpl.kt index 8aa479c5c..801dc9614 100644 --- a/data/src/main/java/com/london/data/repository/recent/RecentSearchRepositoryImpl.kt +++ b/data/src/main/java/com/london/data/repository/recent/RecentSearchRepositoryImpl.kt @@ -11,6 +11,7 @@ import javax.inject.Inject class RecentSearchRepositoryImpl @Inject constructor( private val recentSearchLocalDataSource: RecentDataSource ) : RecentRepository { + override suspend fun insert(item: RecentSearch) = recentSearchLocalDataSource.insertAndKeepLastTen(item.toRecentSearch()) @@ -22,4 +23,5 @@ class RecentSearchRepositoryImpl @Inject constructor( override suspend fun delete(item: RecentSearch) { recentSearchLocalDataSource.delete(item.toRecentSearch()) } + } diff --git a/data/src/main/java/com/london/data/repository/recent/RecentViewedRepositoryImpl.kt b/data/src/main/java/com/london/data/repository/recent/RecentViewedRepositoryImpl.kt index 630e158b1..5d8b966cf 100644 --- a/data/src/main/java/com/london/data/repository/recent/RecentViewedRepositoryImpl.kt +++ b/data/src/main/java/com/london/data/repository/recent/RecentViewedRepositoryImpl.kt @@ -11,6 +11,7 @@ import javax.inject.Inject data class RecentViewedRepositoryImpl @Inject constructor( private val recentRecentViewedLocalDataSource: RecentDataSource ) : RecentRepository { + override suspend fun insert(item: RecentViewed) = recentRecentViewedLocalDataSource.insertAndKeepLastTen(item.toLocal()) @@ -22,4 +23,5 @@ data class RecentViewedRepositoryImpl @Inject constructor( override suspend fun delete(item: RecentViewed) { recentRecentViewedLocalDataSource.delete(item.toLocal()) } -} \ No newline at end of file + +} diff --git a/data/src/main/java/com/london/data/repository/recent/RecentWatchedRepositoryImpl.kt b/data/src/main/java/com/london/data/repository/recent/RecentWatchedRepositoryImpl.kt index a5d2f4aa2..0fe653e79 100644 --- a/data/src/main/java/com/london/data/repository/recent/RecentWatchedRepositoryImpl.kt +++ b/data/src/main/java/com/london/data/repository/recent/RecentWatchedRepositoryImpl.kt @@ -18,6 +18,7 @@ class RecentWatchedRepositoryImpl @Inject constructor( private val recentWatchedMoviesDataSource: RecentWatchedDataSource, private val recentWatchedTvShowsDataSource: RecentWatchedDataSource ) : RecentWatchedRepository { + override suspend fun getAllRecentWatchedMovies(): Flow> = recentWatchedMoviesDataSource.getAll().map { list -> list.map { item -> item.toEntity() } } @@ -29,4 +30,5 @@ class RecentWatchedRepositoryImpl @Inject constructor( override suspend fun insertTvShow(item: TvShow) = recentWatchedTvShowsDataSource.insert(item.toRecentWatchedTvShowLocal()) + } diff --git a/data/src/main/java/com/london/data/repository/search/SearchRepositoryImpl.kt b/data/src/main/java/com/london/data/repository/search/SearchRepositoryImpl.kt index b22881989..a5a6ad5d1 100644 --- a/data/src/main/java/com/london/data/repository/search/SearchRepositoryImpl.kt +++ b/data/src/main/java/com/london/data/repository/search/SearchRepositoryImpl.kt @@ -54,10 +54,10 @@ class SearchRepositoryImpl @Inject constructor( name: String, pageNumber: Int ): ApiResponse = remoteDataSource.searchForTvShows( - query = name, - includeAdult = false, - pageNumber = pageNumber, - ).getOrThrow() + query = name, + includeAdult = false, + pageNumber = pageNumber, + ).getOrThrow() override suspend fun searchForActors( name: String, @@ -97,19 +97,19 @@ class SearchRepositoryImpl @Inject constructor( name: String, pageNumber: Int ): ApiResponse = remoteDataSource.searchForMovies( - query = name, - includeAdult = false, - pageNumber = pageNumber, - ).getOrThrow() + query = name, + includeAdult = false, + pageNumber = pageNumber, + ).getOrThrow() private suspend fun getActorsSearchResult( name: String, pageNumber: Int ): ApiResponse = remoteDataSource.searchForActors( - query = name, - includeAdult = false, - pageNumber = pageNumber, - ).getOrThrow() + query = name, + includeAdult = false, + pageNumber = pageNumber, + ).getOrThrow() private suspend fun updateGenreInterest(current: GenreInterestEntity) { genreInterestDao.updateGenreInterest( @@ -124,4 +124,5 @@ class SearchRepositoryImpl @Inject constructor( ) ) } + } diff --git a/data/src/main/java/com/london/data/repository/tvshow/TvShowRepositoryImpl.kt b/data/src/main/java/com/london/data/repository/tvshow/TvShowRepositoryImpl.kt index 3fab076f1..58c915269 100644 --- a/data/src/main/java/com/london/data/repository/tvshow/TvShowRepositoryImpl.kt +++ b/data/src/main/java/com/london/data/repository/tvshow/TvShowRepositoryImpl.kt @@ -150,29 +150,29 @@ class TvShowRepositoryImpl @Inject constructor( tvShowId: Int, seasonNumber: Int ): SeasonEpisodes = tvShowRemoteDataSource.getTvShowSeasonEpisodes( - id = tvShowId, - seasonNumber = seasonNumber - ).getOrThrow().toEpisodesEntity() + id = tvShowId, + seasonNumber = seasonNumber + ).getOrThrow().toEpisodesEntity() override suspend fun getTvShowEpisodeByPosition( tvShowId: Int, seasonNumber: Int, episodeNumber: Int ): EpisodeDetails = tvShowRemoteDataSource.getEpisodeDetails( - tvShowId = tvShowId, - seasonNumber = seasonNumber, - episodeNumber = episodeNumber - ).getOrThrow().toEpisodeEntity() + tvShowId = tvShowId, + seasonNumber = seasonNumber, + episodeNumber = episodeNumber + ).getOrThrow().toEpisodeEntity() override suspend fun getEpisodeVideos( tvShowId: Int, seasonNumber: Int, episodeNumber: Int ): List = tvShowRemoteDataSource.getEpisodeVideos( - tvShowId = tvShowId, - seasonNumber = seasonNumber, - episodeNumber = episodeNumber - ).getOrThrow().videos?.map { it.youtubeKey.asYoutubeUrlOrEmpty() }.orEmpty() + tvShowId = tvShowId, + seasonNumber = seasonNumber, + episodeNumber = episodeNumber + ).getOrThrow().videos?.map { it.youtubeKey.asYoutubeUrlOrEmpty() }.orEmpty() override suspend fun getTvSeasonTrailer(tvShowId: Int, seasonNumber: Int): List = tvShowRemoteDataSource.getTvSeasonTrailer(tvShowId = tvShowId, seasonNumber = seasonNumber) @@ -192,7 +192,8 @@ class TvShowRepositoryImpl @Inject constructor( ) } - override suspend fun getAccountTvShowStateById(id: Int + override suspend fun getAccountTvShowStateById( + id: Int ): MediaStates = tvShowRemoteDataSource.getAccountTvShowStates( tvShowId = id, guestSessionId = authenticationPreferences.getGuestSessionId(), @@ -219,7 +220,6 @@ class TvShowRepositoryImpl @Inject constructor( pageNumber = pageNumber ).getOrThrow().toReviewEntity() - private suspend fun getTopRatedPages(pageNumber: Int): PagedFetchResponse { val remoteResult = tvShowRemoteDataSource.getTopRatedTvShows(pageNumber).getOrThrow() val tvShows = remoteResult.items.map { it.toEntity() } @@ -232,9 +232,9 @@ class TvShowRepositoryImpl @Inject constructor( } private suspend fun getTopRatedRemoteTvShows(pageNumber: Int) = tvShowRemoteDataSource - .getTopRatedTvShows(pageNumber = pageNumber) - .getOrThrow() - .items.map { it.toEntity() } + .getTopRatedTvShows(pageNumber = pageNumber) + .getOrThrow() + .items.map { it.toEntity() } private suspend fun fetchFirstTopRatedPageTvShows(): List { return tvShowRemoteDataSource @@ -260,4 +260,5 @@ class TvShowRepositoryImpl @Inject constructor( companion object { const val PAGE_NUMBER = 1 } + } diff --git a/data/src/main/java/com/london/data/utils/FirebaseCrashReporter.kt b/data/src/main/java/com/london/data/utils/FirebaseCrashReporter.kt index d7d17ae88..02757785e 100644 --- a/data/src/main/java/com/london/data/utils/FirebaseCrashReporter.kt +++ b/data/src/main/java/com/london/data/utils/FirebaseCrashReporter.kt @@ -6,6 +6,7 @@ import javax.inject.Inject interface CrashReporter { fun logException(exception: Throwable) } + class FirebaseCrashReporter @Inject constructor() : CrashReporter { override fun logException(exception: Throwable) { FirebaseCrashlytics.getInstance().apply { @@ -15,4 +16,4 @@ class FirebaseCrashReporter @Inject constructor() : CrashReporter { recordException(exception) } } -} \ No newline at end of file +} diff --git a/data/src/main/java/com/london/data/utils/currentDate.kt b/data/src/main/java/com/london/data/utils/currentDate.kt index 387c375aa..e39724c1e 100644 --- a/data/src/main/java/com/london/data/utils/currentDate.kt +++ b/data/src/main/java/com/london/data/utils/currentDate.kt @@ -4,6 +4,6 @@ import kotlinx.datetime.Clock import kotlinx.datetime.TimeZone import kotlinx.datetime.toLocalDateTime - fun getCurrentDate(): String = Clock.System.now() +fun getCurrentDate(): String = Clock.System.now() .toLocalDateTime(TimeZone.currentSystemDefault()) .date.toString() diff --git a/data/src/main/java/com/london/data/utils/extensions.kt b/data/src/main/java/com/london/data/utils/extensions.kt index 630a6cefd..8b221d17f 100644 --- a/data/src/main/java/com/london/data/utils/extensions.kt +++ b/data/src/main/java/com/london/data/utils/extensions.kt @@ -34,6 +34,7 @@ fun String.extractYear() = takeIf { isNotEmpty() }?.split("-")?.first()?.toInt() ?: 0 fun Int.orDefault(default: Int = 1): Int = if (this != 0) this else default + fun Long.isDayExpired(): Boolean { val oneDayInMillis = 24 * 60 * 60 * 1000L val oneDayAgo = System.currentTimeMillis() - oneDayInMillis @@ -48,4 +49,5 @@ fun JsonElement?.parseRatingValue(): Double? = when { } fun RequestTokenResponse.isFailure() = success.isTrue.not() -fun GuestSessionResponse.isFailure() = success.isTrue.not() \ No newline at end of file + +fun GuestSessionResponse.isFailure() = success.isTrue.not() diff --git a/data/src/main/java/com/london/data/utils/FetchAndSync.kt b/data/src/main/java/com/london/data/utils/fetchAndSync.kt similarity index 89% rename from data/src/main/java/com/london/data/utils/FetchAndSync.kt rename to data/src/main/java/com/london/data/utils/fetchAndSync.kt index fcfdf3b72..70c2d9984 100644 --- a/data/src/main/java/com/london/data/utils/FetchAndSync.kt +++ b/data/src/main/java/com/london/data/utils/fetchAndSync.kt @@ -12,4 +12,4 @@ suspend fun fetchAndSync( networkBlock().also { syncBlock?.invoke(it) } -}.onFailure { crashReporter?.logException(it) }.getOrThrow() \ No newline at end of file +}.onFailure { crashReporter?.logException(it) }.getOrThrow() diff --git a/data/src/main/java/com/london/data/utils/FromJsonList.kt b/data/src/main/java/com/london/data/utils/fromJsonList.kt similarity index 100% rename from data/src/main/java/com/london/data/utils/FromJsonList.kt rename to data/src/main/java/com/london/data/utils/fromJsonList.kt diff --git a/data/src/main/java/com/london/data/worker/MovieListSyncWorker.kt b/data/src/main/java/com/london/data/worker/MovieListSyncWorker.kt index 5bcc8a456..512d8e904 100644 --- a/data/src/main/java/com/london/data/worker/MovieListSyncWorker.kt +++ b/data/src/main/java/com/london/data/worker/MovieListSyncWorker.kt @@ -37,8 +37,7 @@ class MovieListSyncWorker @AssistedInject constructor( } companion object { - const val WORK_NAME = "movie_list_sync" - const val IMMEDIATE_SYNC_WORK_NAME = "movie_list_sync_immediate" + private const val WORK_NAME = "movie_list_sync" private const val MAX_RETRY_ATTEMPTS = 3 fun schedulePeriodicSync(workManager: WorkManager) { @@ -70,4 +69,4 @@ class MovieListSyncWorker @AssistedInject constructor( ) } } -} \ No newline at end of file +} diff --git a/data/src/test/java/com/london/data/mapper/trending/MediaTrendingMapperTest.kt b/data/src/test/java/com/london/data/mapper/trending/MediaTrendingMapperTest.kt index 9010baed0..6f67afb0f 100644 --- a/data/src/test/java/com/london/data/mapper/trending/MediaTrendingMapperTest.kt +++ b/data/src/test/java/com/london/data/mapper/trending/MediaTrendingMapperTest.kt @@ -84,7 +84,6 @@ class MediaTrendingMapperTest { assertEquals(0, result.id) assertEquals("", result.title) assertEquals("", result.posterPath) - assertEquals(emptyList(), result.genres) } @Test @@ -142,7 +141,6 @@ class MediaTrendingMapperTest { assertEquals(123, result.id) assertEquals("", result.title) assertEquals("https://image.tmdb.org/t/p/w500", result.posterPath) - assertEquals(emptyList(), result.genres) } @Test diff --git a/data/src/test/java/com/london/data/repository/SearchRepositoryImplTest.kt b/data/src/test/java/com/london/data/repository/SearchRepositoryImplTest.kt index fc13140df..9402ca554 100644 --- a/data/src/test/java/com/london/data/repository/SearchRepositoryImplTest.kt +++ b/data/src/test/java/com/london/data/repository/SearchRepositoryImplTest.kt @@ -4,19 +4,12 @@ import com.google.common.truth.Truth.assertThat import com.london.data.local.database.dao.search.GenreInterestDao import com.london.data.local.model.search.GenreInterestEntity import com.london.data.remote.exception.ResponseException -import com.london.data.remote.model.ApiResponse -import com.london.data.remote.model.search.SearchMovieRemote -import com.london.data.remote.model.search.SearchTvShowRemote import com.london.data.remote.source.search.SearchRemoteDataSource import com.london.data.repository.search.SearchRepositoryImpl import com.london.data.utils.CrashReporter import com.london.data.utils.fetchAndSync -import com.london.domain.entity.actor.Actor import com.london.domain.entity.genre.MovieGenre import com.london.domain.entity.genre.TvShowGenre -import com.london.domain.entity.movie.Movie -import com.london.domain.entity.shared.PagedFetchResponse -import com.london.domain.entity.tvshow.TvShow import io.mockk.coEvery import io.mockk.coJustRun import io.mockk.coVerify @@ -318,85 +311,6 @@ class SearchRepositoryImplTest { private companion object { private const val NAME = "Tom" - private const val LANG = "en-US" private const val PAGE_NUMBER = 1 - - private val MovieList = PagedFetchResponse( - PAGE_NUMBER, - listOf( - Movie( - id = 1, - name = "", - posterUrl = "https://image.tmdb.org/t/p/w500", - releaseYear = 2020, - rating = 8, - genres = listOf(), - ) - ), - totalItems = 1, - totalPages = 1 - ) - - private val TvShowList = PagedFetchResponse( - PAGE_NUMBER, - listOf( - TvShow( - id = 2, - name = "", - posterPicture = "https://image.tmdb.org/t/p/w500", - releaseYear = 2020, - rating = 10, - genres = listOf(), - ) - ), - totalItems = 1, - totalPages = 1 - ) - - private val ActorList = PagedFetchResponse( - PAGE_NUMBER, - listOf( - Actor( - id = 3, - name = "Tom Holland", - profilePictureUrl = "https://image.tmdb.org/t/p/w500/tom_holland.jpg", - characterName = "" - ) - ), - totalItems = 1, - totalPages = 1 - ) - - private val SearchMoviesRemoteMock = ApiResponse( - currentPage = PAGE_NUMBER, - items = listOf( - SearchMovieRemote( - genreIds = emptyList(), - id = 1, - posterPath = "", - releaseDate = "2020-06-15", - voteAverage = 8.0, - name = "", - ) - ), - totalPages = 1, - totalItems = 1 - ) - - private val SearchTvShowRemoteMock = ApiResponse( - currentPage = PAGE_NUMBER, - items = listOf( - SearchTvShowRemote( - genreIds = emptyList(), - id = 2, - posterPath = "", - firstAirDate = "2020-07-20", - name = "", - voteAverage = 10.0, - ) - ), - totalPages = 1, - totalItems = 1 - ) } } diff --git a/designSystem/src/main/java/com/london/designsystem/component/AppNavBar.kt b/designSystem/src/main/java/com/london/designsystem/component/AppNavBar.kt index 8d0e3a091..1eb870a95 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/AppNavBar.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/AppNavBar.kt @@ -59,7 +59,6 @@ data class NavigationTab( val destination: T, ) - data class NavBarColors( val backgroundColor: Color, val selectedIconColor: Color, @@ -81,7 +80,6 @@ fun NavBar( topBorderColor = NovixTheme.colors.stroke ) ) { - Box( modifier = modifier .fillMaxWidth() diff --git a/designSystem/src/main/java/com/london/designsystem/component/BottomSheet.kt b/designSystem/src/main/java/com/london/designsystem/component/BottomSheet.kt index 9cab13153..ff0c1d940 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/BottomSheet.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/BottomSheet.kt @@ -68,4 +68,4 @@ fun ModalBottomSheet( properties = ModalBottomSheetDefaults.properties, content = content, ) -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/ButtonIcon.kt b/designSystem/src/main/java/com/london/designsystem/component/ButtonIcon.kt index 2684370f8..42102b2a6 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/ButtonIcon.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/ButtonIcon.kt @@ -45,4 +45,3 @@ fun ButtonIcon( ) } } - diff --git a/designSystem/src/main/java/com/london/designsystem/component/CircularLoading.kt b/designSystem/src/main/java/com/london/designsystem/component/CircularLoading.kt index 44a135178..3d24d5cef 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/CircularLoading.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/CircularLoading.kt @@ -35,7 +35,6 @@ fun CircularLoading( ), label = "progress" ) - val stroke = NovixTheme.colors.stroke val primaryColor = NovixTheme.colors.primary @@ -73,4 +72,4 @@ fun CircularLoading( @Composable private fun Preview() { CircularLoading() -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/CustomReleasedYearSlider.kt b/designSystem/src/main/java/com/london/designsystem/component/CustomReleasedYearSlider.kt index 40dd70b63..997ce6a69 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/CustomReleasedYearSlider.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/CustomReleasedYearSlider.kt @@ -33,7 +33,6 @@ fun CustomReleasedYearSlider( minYear: Int = 1995, maxYear: Int = 2025 ) { - Column(modifier = modifier) { Row( modifier = Modifier diff --git a/designSystem/src/main/java/com/london/designsystem/component/DefaultTopBar.kt b/designSystem/src/main/java/com/london/designsystem/component/DefaultTopBar.kt index e14138eda..d76ff52da 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/DefaultTopBar.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/DefaultTopBar.kt @@ -55,11 +55,11 @@ fun DefaultTopBar( @Composable @ThemePreviews -fun DefaultPreview() { +private fun DefaultPreview() { DefaultTopBar( appName = "Novix", appDescription = "Born from Nova, Made for Flix.", appIconRes = R.drawable.novix_icon, appIconContentDescription = "Logo" ) -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/DeleteIcon.kt b/designSystem/src/main/java/com/london/designsystem/component/DeleteIcon.kt index 02c0f1f57..8d86cff5e 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/DeleteIcon.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/DeleteIcon.kt @@ -49,10 +49,10 @@ fun DeleteIcon( @ThemePreviews @Composable -fun DeleteIconPreview() { +private fun DeleteIconPreview() { NovixTheme { DeleteIcon( onDeleteClick = {} ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/Divider.kt b/designSystem/src/main/java/com/london/designsystem/component/Divider.kt index 22c3a4bdc..28952f302 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/Divider.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/Divider.kt @@ -23,4 +23,4 @@ fun Divider( .height(thickness) .background(color) ) -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/Dropdown.kt b/designSystem/src/main/java/com/london/designsystem/component/Dropdown.kt index a1681c3d5..38edac782 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/Dropdown.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/Dropdown.kt @@ -50,4 +50,4 @@ fun DropdownItem( textColor = NovixTheme.colors.body ) ) -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/EmptyLayout.kt b/designSystem/src/main/java/com/london/designsystem/component/EmptyLayout.kt index a09c9d983..42459d685 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/EmptyLayout.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/EmptyLayout.kt @@ -79,4 +79,4 @@ fun EmptyLayout( additionalContent?.let { it() } } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/GuestUserLoginBottomSheet.kt b/designSystem/src/main/java/com/london/designsystem/component/GuestUserLoginBottomSheet.kt index c16000bef..278aaab68 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/GuestUserLoginBottomSheet.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/GuestUserLoginBottomSheet.kt @@ -27,8 +27,6 @@ fun GuestUserLoginBottomSheet( onLoginClick: () -> Unit, sheetState: SheetState = rememberModalBottomSheetState() ) { - - ModalBottomSheet( onDismissRequest = onDismissClick, state = sheetState, diff --git a/designSystem/src/main/java/com/london/designsystem/component/Icon.kt b/designSystem/src/main/java/com/london/designsystem/component/Icon.kt index 0dea65df1..d11702883 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/Icon.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/Icon.kt @@ -18,4 +18,4 @@ fun Icon( contentDescription = contentDescription, modifier = modifier, ) -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/MyRatingIcon.kt b/designSystem/src/main/java/com/london/designsystem/component/MyRatingIcon.kt index 06e22172f..f3ea1d207 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/MyRatingIcon.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/MyRatingIcon.kt @@ -41,7 +41,7 @@ fun MyRatingIcon( Icon( painter = painterResource(R.drawable.ic_star_filled), contentDescription = "star", - tint = NovixTheme.colors.yellowAccent, + tint = NovixTheme.colors.yellowAccent, ) Text( text = rate, @@ -53,10 +53,10 @@ fun MyRatingIcon( @ThemePreviews @Composable -fun MyRatingIconPreview() { +private fun MyRatingIconPreview() { NovixTheme { MyRatingIcon( rate = "4" ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/NovixCarousalDot.kt b/designSystem/src/main/java/com/london/designsystem/component/NovixCarousalDot.kt index 8ddb51e4a..da6558621 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/NovixCarousalDot.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/NovixCarousalDot.kt @@ -74,11 +74,11 @@ private fun NovixCarousalDot( @ThemePreviews @Composable -fun PreviewCarousalDot() { +private fun PreviewCarousalDot() { NovixTheme { NovixCarousalRow( dotsStates = listOf(false, true, false, false, false, false, false, false), modifier = Modifier.width(44.dp) ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/NovixChip.kt b/designSystem/src/main/java/com/london/designsystem/component/NovixChip.kt index a76e8c3e7..f73c4cc11 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/NovixChip.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/NovixChip.kt @@ -110,4 +110,4 @@ private fun ChipGroupPreview() { ) } } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/OutlinedTextField.kt b/designSystem/src/main/java/com/london/designsystem/component/OutlinedTextField.kt index 14693e23a..8921b7304 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/OutlinedTextField.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/OutlinedTextField.kt @@ -74,6 +74,7 @@ fun OutlinedTextField( passwordVisibleIcon: Painter? = null, passwordHiddenIcon: Painter? = null ) { + val isFocused by interactionSource.collectIsFocusedAsState() val mergedTextStyle = textStyle.merge(TextStyle(color = NovixTheme.colors.body)) val isPasswordEmpty = value.text.isEmpty() @@ -130,7 +131,14 @@ fun OutlinedTextField( placeholder = placeholder, leadingIcon = null, trailingIcon = currentTrailingIcon, - prefix = leadingIcon?.let { { AnimatedLeadingIcon(painter = it, isFocused = isFocused) } }, + prefix = leadingIcon?.let { + { + AnimatedLeadingIcon( + painter = it, + isFocused = isFocused + ) + } + }, suffix = suffix, supportingText = supportingText, singleLine = singleLine, @@ -285,7 +293,7 @@ private fun PasswordToggleIcon( @ThemePreviews @Composable -fun TextFieldDefaultPreview() { +private fun TextFieldDefaultPreview() { var value by remember { mutableStateOf(TextFieldValue("Preview value")) } val interactionSource = remember { MutableInteractionSource() } @@ -309,7 +317,7 @@ fun TextFieldDefaultPreview() { @Preview @Composable -fun PasswordFieldEmptyPreview() { +private fun PasswordFieldEmptyPreview() { var value by remember { mutableStateOf(TextFieldValue("")) } var passwordVisible by remember { mutableStateOf(false) } val interactionSource = remember { MutableInteractionSource() } @@ -338,7 +346,7 @@ fun PasswordFieldEmptyPreview() { @Preview @Composable -fun PasswordFieldFilledPreview() { +private fun PasswordFieldFilledPreview() { var value by remember { mutableStateOf(TextFieldValue("SecurePassword123")) } var passwordVisible by remember { mutableStateOf(false) } val interactionSource = remember { MutableInteractionSource() } @@ -370,7 +378,7 @@ fun PasswordFieldFilledPreview() { @Preview @Composable -fun TextFieldErrorStatePreview() { +private fun TextFieldErrorStatePreview() { var value by remember { mutableStateOf(TextFieldValue("invalid-email")) } val interactionSource = remember { MutableInteractionSource() } @@ -401,7 +409,7 @@ fun TextFieldErrorStatePreview() { @Preview @Composable -fun TextFieldDisabledPreview() { +private fun TextFieldDisabledPreview() { var value by remember { mutableStateOf(TextFieldValue("Disabled field")) } val interactionSource = remember { MutableInteractionSource() } @@ -426,7 +434,7 @@ fun TextFieldDisabledPreview() { @Preview @Composable -fun TextFieldNoLabelPreview() { +private fun TextFieldNoLabelPreview() { var value by remember { mutableStateOf(TextFieldValue("No label example")) } val interactionSource = remember { MutableInteractionSource() } diff --git a/designSystem/src/main/java/com/london/designsystem/component/RatingBar.kt b/designSystem/src/main/java/com/london/designsystem/component/RatingBar.kt index a979bc032..d17a2a17b 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/RatingBar.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/RatingBar.kt @@ -68,4 +68,4 @@ fun RatingBar( ) } } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/RatingBottomSheet.kt b/designSystem/src/main/java/com/london/designsystem/component/RatingBottomSheet.kt index dbb4bbc51..172b08c30 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/RatingBottomSheet.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/RatingBottomSheet.kt @@ -31,7 +31,6 @@ fun RatingBottomSheet( onDismissClick: () -> Unit, onSubmitClick: (Int) -> Unit, sheetState: SheetState = rememberModalBottomSheetState() - ) { var rating by remember { mutableIntStateOf(0) } @@ -98,7 +97,9 @@ fun RatingBottomSheet( R.string.outline_star ), tint = NovixTheme.colors.yellowAccent, - modifier = Modifier.weight(1f).clickable{ rating = i } + modifier = Modifier + .weight(1f) + .clickable { rating = i } ) } } diff --git a/designSystem/src/main/java/com/london/designsystem/component/SaveIcon.kt b/designSystem/src/main/java/com/london/designsystem/component/SaveIcon.kt index 8bf53fee8..b7ba3e78a 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/SaveIcon.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/SaveIcon.kt @@ -81,7 +81,7 @@ fun SaveIcon( @ThemePreviews @Composable -fun SaveIconPreview() { +private fun SaveIconPreview() { NovixTheme { var isSaved by remember { mutableStateOf(true) } SaveIcon( @@ -89,4 +89,4 @@ fun SaveIconPreview() { onSaveClick = { isSaved = !isSaved } ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/Scaffold.kt b/designSystem/src/main/java/com/london/designsystem/component/Scaffold.kt index 370f7cebf..5285dcc2c 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/Scaffold.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/Scaffold.kt @@ -27,7 +27,7 @@ fun Scaffold( bottomBar = bottomBar, snackbarHost = snackBarHost, floatingActionButton = floatingActionButton, - floatingActionButtonPosition = FabPosition.End, + floatingActionButtonPosition = FabPosition.End, containerColor = containerColor, contentColor = contentColor, contentWindowInsets = contentWindowInsets, diff --git a/designSystem/src/main/java/com/london/designsystem/component/SectionHeader.kt b/designSystem/src/main/java/com/london/designsystem/component/SectionHeader.kt index 8048c02c7..a2f8f0cfa 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/SectionHeader.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/SectionHeader.kt @@ -45,14 +45,14 @@ fun SectionHeader( text = text, style = NovixTheme.typography.headline.small, color = NovixTheme.colors.title, - )else - Box( - modifier = Modifier - .height(35.dp) - .width(200.dp) - .clip(RoundedCornerShape(8.dp)) - .shimmerEffect() - ) + ) else + Box( + modifier = Modifier + .height(35.dp) + .width(200.dp) + .clip(RoundedCornerShape(8.dp)) + .shimmerEffect() + ) if (hasGetAll && !isLoading) { Row( verticalAlignment = Alignment.CenterVertically, @@ -72,7 +72,7 @@ fun SectionHeader( ) } } - }else if (isLoading){ + } else if (isLoading) { Box( modifier = Modifier .height(35.dp) @@ -86,7 +86,7 @@ fun SectionHeader( @ThemePreviews @Composable -fun SectionHeaderPreview() { +private fun SectionHeaderPreview() { NovixTheme { SectionHeader( text = stringResource(R.string.new_arrival), @@ -94,4 +94,4 @@ fun SectionHeaderPreview() { hasIcon = true ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/Selection.kt b/designSystem/src/main/java/com/london/designsystem/component/Selection.kt index 0c350ffc1..bae190320 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/Selection.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/Selection.kt @@ -79,4 +79,4 @@ private fun SelectionNotSelectedPreview() { mainText = "My favorite", ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/SnackBar.kt b/designSystem/src/main/java/com/london/designsystem/component/SnackBar.kt index cf83d70e9..4f6295397 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/SnackBar.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/SnackBar.kt @@ -71,4 +71,4 @@ private fun FailSnackBarPreview() { icon = painterResource(R.drawable.ic_failed) ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/TabLayout.kt b/designSystem/src/main/java/com/london/designsystem/component/TabLayout.kt index 55e4ff78f..38a5fdc71 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/TabLayout.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/TabLayout.kt @@ -71,7 +71,7 @@ fun TabLayout( } @Composable -fun NovixTab( +private fun NovixTab( @StringRes text: Int, isSelected: Boolean, onClick: () -> Unit, @@ -161,4 +161,4 @@ private fun NovixTabLayoutWithPagerPreview() { onTabSelected = { }, ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/Text.kt b/designSystem/src/main/java/com/london/designsystem/component/Text.kt index d5a3cf7c4..1745862d9 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/Text.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/Text.kt @@ -55,6 +55,7 @@ fun Text( style = style ) } + @Composable fun AnnotatedStringText( text: AnnotatedString, diff --git a/designSystem/src/main/java/com/london/designsystem/component/TopBar.kt b/designSystem/src/main/java/com/london/designsystem/component/TopBar.kt index b1e7794ad..445b7ec04 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/TopBar.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/TopBar.kt @@ -87,7 +87,7 @@ fun TopBar( } @Composable -fun ButtonTopBar( +private fun ButtonTopBar( icon: Int?, onClick: () -> Unit, iconTint: Color? = null @@ -118,7 +118,7 @@ fun ButtonTopBar( @Composable @ThemePreviews -fun TopBarPreview() { +private fun TopBarPreview() { TopBar( onClickOption1 = {}, onClickOption2 = {} diff --git a/designSystem/src/main/java/com/london/designsystem/component/UnSuitableEye.kt b/designSystem/src/main/java/com/london/designsystem/component/UnSuitableEye.kt index 5fa4c8489..8ee60b4d7 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/UnSuitableEye.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/UnSuitableEye.kt @@ -36,4 +36,4 @@ fun UnSuitableEye( color = NovixTheme.colors.body ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/button/ErrorImageBox.kt b/designSystem/src/main/java/com/london/designsystem/component/button/ErrorImageBox.kt index ad4f41657..460e954d5 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/button/ErrorImageBox.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/button/ErrorImageBox.kt @@ -19,4 +19,4 @@ fun ErrorImage() { contentDescription = stringResource(R.string.error_image), modifier = Modifier.size(56.dp) ) -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/button/FloatingActionButton.kt b/designSystem/src/main/java/com/london/designsystem/component/button/FloatingActionButton.kt index ca0b6821e..22e21b551 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/button/FloatingActionButton.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/button/FloatingActionButton.kt @@ -54,7 +54,7 @@ fun FloatingActionButton( @ThemePreviews @Composable -fun DefaultFloatingActionButtonPreview() { +private fun DefaultFloatingActionButtonPreview() { NovixTheme { FloatingActionButton( modifier = Modifier.size(100.dp), @@ -68,7 +68,7 @@ fun DefaultFloatingActionButtonPreview() { @ThemePreviews @Composable -fun LoadingFloatingActionButtonPreview() { +private fun LoadingFloatingActionButtonPreview() { NovixTheme { FloatingActionButton( modifier = Modifier.size(100.dp), @@ -82,7 +82,7 @@ fun LoadingFloatingActionButtonPreview() { @ThemePreviews @Composable -fun DisabledFloatingActionButtonPreview() { +private fun DisabledFloatingActionButtonPreview() { NovixTheme { FloatingActionButton( modifier = Modifier.size(100.dp), @@ -92,4 +92,4 @@ fun DisabledFloatingActionButtonPreview() { isDefaultIcon = false ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/button/LoadingLottieAnimation.kt b/designSystem/src/main/java/com/london/designsystem/component/button/LoadingLottieAnimation.kt index 6eed30499..cce40b9a1 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/button/LoadingLottieAnimation.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/button/LoadingLottieAnimation.kt @@ -1,6 +1,5 @@ package com.london.designsystem.component.button - import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier @@ -18,7 +17,6 @@ import com.london.designsystem.R import com.london.designsystem.theme.NovixTheme import com.london.designsystem.theme.ThemePreviews - @Composable fun LoadingLottieAnimation(modifier: Modifier = Modifier, tintColor: Color) { val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.lottie_loading)) @@ -43,4 +41,4 @@ private fun PreviewLoadingLottieAnimation() { tintColor = NovixTheme.colors.onPrimary, ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/button/OutlineButton.kt b/designSystem/src/main/java/com/london/designsystem/component/button/OutlineButton.kt index a8a127d75..46e74c224 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/button/OutlineButton.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/button/OutlineButton.kt @@ -76,7 +76,7 @@ fun OutlineButton( @ThemePreviews @Composable -fun PreviewNormalOutlineButton() { +private fun PreviewNormalOutlineButton() { NovixTheme { OutlineButton( text = "Watch", @@ -91,7 +91,7 @@ fun PreviewNormalOutlineButton() { @ThemePreviews @Composable -fun PreviewLoadingOutlineButton() { +private fun PreviewLoadingOutlineButton() { NovixTheme { OutlineButton( text = "Watch", @@ -106,7 +106,7 @@ fun PreviewLoadingOutlineButton() { @ThemePreviews @Composable -fun PreviewDisabledPrimaryDisable() { +private fun PreviewDisabledPrimaryDisable() { NovixTheme { OutlineButton( text = "Watch", @@ -122,7 +122,7 @@ fun PreviewDisabledPrimaryDisable() { @ThemePreviews @Composable -fun PreviewOutlinePrimaryWithIcon() { +private fun PreviewOutlinePrimaryWithIcon() { NovixTheme { OutlineButton( text = "Watch", @@ -137,7 +137,7 @@ fun PreviewOutlinePrimaryWithIcon() { @ThemePreviews @Composable -fun PreviewPrimaryWithIconOnly() { +private fun PreviewPrimaryWithIconOnly() { NovixTheme { PrimaryButton( text = "", @@ -149,4 +149,4 @@ fun PreviewPrimaryWithIconOnly() { ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/button/PrimaryButton.kt b/designSystem/src/main/java/com/london/designsystem/component/button/PrimaryButton.kt index 0696cde4f..4a28fa6db 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/button/PrimaryButton.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/button/PrimaryButton.kt @@ -29,7 +29,6 @@ import com.london.designsystem.R import com.london.designsystem.theme.NovixTheme import com.london.designsystem.theme.ThemePreviews - @Composable fun PrimaryButton( text: String?, @@ -129,7 +128,7 @@ private fun Modifier.insetShadow( @ThemePreviews @Composable -fun PreviewPrimaryNormal() { +private fun PreviewPrimaryNormal() { NovixTheme { PrimaryButton( text = "Watch", @@ -145,7 +144,7 @@ fun PreviewPrimaryNormal() { @ThemePreviews @Composable -fun PreviewPrimaryLoading() { +private fun PreviewPrimaryLoading() { NovixTheme { PrimaryButton( text = "Watch", @@ -161,7 +160,7 @@ fun PreviewPrimaryLoading() { @ThemePreviews @Composable -fun PreviewPrimaryDisable() { +private fun PreviewPrimaryDisable() { NovixTheme { PrimaryButton( text = "Watch", @@ -177,7 +176,7 @@ fun PreviewPrimaryDisable() { @ThemePreviews @Composable -fun PreviewPrimaryWithTextAndIcon() { +private fun PreviewPrimaryWithTextAndIcon() { NovixTheme { PrimaryButton( text = "Watch", @@ -193,7 +192,7 @@ fun PreviewPrimaryWithTextAndIcon() { @ThemePreviews @Composable -fun PreviewPrimaryWithIcon() { +private fun PreviewPrimaryWithIcon() { NovixTheme { PrimaryButton( text = "", @@ -206,4 +205,4 @@ fun PreviewPrimaryWithIcon() { ) } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/component/carousel/HeroCarousel.kt b/designSystem/src/main/java/com/london/designsystem/component/carousel/HeroCarousel.kt index 73dce095b..62cd7a0fd 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/carousel/HeroCarousel.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/carousel/HeroCarousel.kt @@ -30,13 +30,8 @@ import com.london.designsystem.component.carousel.m3.CarouselItemScope import com.london.designsystem.component.carousel.m3.CarouselState import com.london.designsystem.component.carousel.m3.keylineListOf import com.london.designsystem.component.carousel.m3.rememberCarouselState -import kotlin.Float -import kotlin.Int -import kotlin.Unit import kotlin.math.floor import kotlin.math.max -import kotlin.repeat -import kotlin.with @Composable fun HeroCarousel( @@ -94,7 +89,7 @@ fun HeroCarousel( @Composable @Preview -fun MyCarouselScreen() { +private fun MyCarouselScreen() { Surface(modifier = Modifier.fillMaxSize()) { Column( horizontalAlignment = Alignment.CenterHorizontally, @@ -128,4 +123,4 @@ fun MyCarouselScreen() { } } } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/theme/NovixTheme.kt b/designSystem/src/main/java/com/london/designsystem/theme/NovixTheme.kt index 687fd9bd7..04b5b3f6c 100644 --- a/designSystem/src/main/java/com/london/designsystem/theme/NovixTheme.kt +++ b/designSystem/src/main/java/com/london/designsystem/theme/NovixTheme.kt @@ -20,4 +20,4 @@ fun NovixTheme( ) { content() } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/theme/Theme.kt b/designSystem/src/main/java/com/london/designsystem/theme/Theme.kt index b7d2e7e19..235f624d4 100644 --- a/designSystem/src/main/java/com/london/designsystem/theme/Theme.kt +++ b/designSystem/src/main/java/com/london/designsystem/theme/Theme.kt @@ -9,8 +9,6 @@ import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.Modifier import androidx.compose.ui.composed import com.london.designsystem.color.LightNovixColors -import com.london.designsystem.color.LinearGradientDark -import com.london.designsystem.color.LinearGradientLight import com.london.designsystem.color.NovixColors import com.london.designsystem.typography.NovixTypography import com.london.designsystem.typography.NovixTypographySet diff --git a/designSystem/src/main/java/com/london/designsystem/theme/ThemePreview.kt b/designSystem/src/main/java/com/london/designsystem/theme/ThemePreview.kt index afbe2a7f0..031c4e454 100644 --- a/designSystem/src/main/java/com/london/designsystem/theme/ThemePreview.kt +++ b/designSystem/src/main/java/com/london/designsystem/theme/ThemePreview.kt @@ -3,7 +3,6 @@ package com.london.designsystem.theme import android.content.res.Configuration import androidx.compose.ui.tooling.preview.Preview - // Small phone (Pixel 4a) @Preview( name = "LIGHT - Small", @@ -47,4 +46,5 @@ import androidx.compose.ui.tooling.preview.Preview uiMode = Configuration.UI_MODE_NIGHT_NO, device = "spec:width=411dp,height=891dp,dpi=420" ) + annotation class ThemePreviews diff --git a/designSystem/src/main/java/com/london/designsystem/typography/NovixTextStyle.kt b/designSystem/src/main/java/com/london/designsystem/typography/NovixTextStyle.kt index 6bb71ff16..f1d434dd6 100644 --- a/designSystem/src/main/java/com/london/designsystem/typography/NovixTextStyle.kt +++ b/designSystem/src/main/java/com/london/designsystem/typography/NovixTextStyle.kt @@ -14,4 +14,3 @@ data class TextStyleGroup( val medium: TextStyle, val large: TextStyle, ) - diff --git a/designSystem/src/main/java/com/london/designsystem/typography/NovixThemeTypography.kt b/designSystem/src/main/java/com/london/designsystem/typography/NovixThemeTypography.kt index ec70c21bb..17f66d7b4 100644 --- a/designSystem/src/main/java/com/london/designsystem/typography/NovixThemeTypography.kt +++ b/designSystem/src/main/java/com/london/designsystem/typography/NovixThemeTypography.kt @@ -98,4 +98,4 @@ val NovixTypography = NovixTypographySet( lineHeight = 24.sp ) ) -) \ No newline at end of file +) diff --git a/designSystem/src/main/java/com/london/designsystem/utils/CustomModifiers.kt b/designSystem/src/main/java/com/london/designsystem/utils/CustomModifiers.kt index f1b26e623..f7ffea921 100644 --- a/designSystem/src/main/java/com/london/designsystem/utils/CustomModifiers.kt +++ b/designSystem/src/main/java/com/london/designsystem/utils/CustomModifiers.kt @@ -68,4 +68,4 @@ fun Modifier.shimmerEffect(): Modifier = composed { drawRect(brush = shimmerBrush) } } -} \ No newline at end of file +} diff --git a/designSystem/src/main/java/com/london/designsystem/utils/Extentions.kt b/designSystem/src/main/java/com/london/designsystem/utils/extensions.kt similarity index 100% rename from designSystem/src/main/java/com/london/designsystem/utils/Extentions.kt rename to designSystem/src/main/java/com/london/designsystem/utils/extensions.kt diff --git a/designSystem/src/test/java/com/london/designsystem/ExampleUnitTest.kt b/designSystem/src/test/java/com/london/designsystem/ExampleUnitTest.kt deleted file mode 100644 index da3689eb0..000000000 --- a/designSystem/src/test/java/com/london/designsystem/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.london.designsystem - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/domain/src/main/java/com/london/domain/entity/account/AccountInfo.kt b/domain/src/main/java/com/london/domain/entity/account/AccountInfo.kt index 92b20583b..baf823ce6 100644 --- a/domain/src/main/java/com/london/domain/entity/account/AccountInfo.kt +++ b/domain/src/main/java/com/london/domain/entity/account/AccountInfo.kt @@ -4,4 +4,4 @@ data class AccountInfo( val id: Int, val userName: String, val avatarPath: String -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/london/domain/entity/actor/Actor.kt b/domain/src/main/java/com/london/domain/entity/actor/Actor.kt index 1966e89fa..0d777d572 100644 --- a/domain/src/main/java/com/london/domain/entity/actor/Actor.kt +++ b/domain/src/main/java/com/london/domain/entity/actor/Actor.kt @@ -5,4 +5,4 @@ data class Actor( val name: String, val profilePictureUrl: String, val characterName: String, -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/london/domain/entity/contentrestriction/ContentRestrictionLevel.kt b/domain/src/main/java/com/london/domain/entity/contentrestriction/ContentRestrictionLevel.kt index db21d964f..0908e0cc2 100644 --- a/domain/src/main/java/com/london/domain/entity/contentrestriction/ContentRestrictionLevel.kt +++ b/domain/src/main/java/com/london/domain/entity/contentrestriction/ContentRestrictionLevel.kt @@ -4,4 +4,4 @@ enum class ContentRestrictionLevel { STRICT, MODERATE, OFF -} \ No newline at end of file +} diff --git a/domain/src/main/java/com/london/domain/entity/language/AppLanguage.kt b/domain/src/main/java/com/london/domain/entity/language/AppLanguage.kt index d97a40571..65e3f3ec9 100644 --- a/domain/src/main/java/com/london/domain/entity/language/AppLanguage.kt +++ b/domain/src/main/java/com/london/domain/entity/language/AppLanguage.kt @@ -8,4 +8,4 @@ enum class AppLanguage(val code: String) { fun fromCode(languageCode: String): AppLanguage = AppLanguage.entries.find { it.code == languageCode } ?: ARABIC } -} \ No newline at end of file +} diff --git a/domain/src/main/java/com/london/domain/entity/movie/MovieDetails.kt b/domain/src/main/java/com/london/domain/entity/movie/MovieDetails.kt index e6fc76df9..3c4c431ab 100644 --- a/domain/src/main/java/com/london/domain/entity/movie/MovieDetails.kt +++ b/domain/src/main/java/com/london/domain/entity/movie/MovieDetails.kt @@ -13,4 +13,4 @@ data class MovieDetails( val title: String, val video: Boolean, val voteAverage: String, -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/london/domain/entity/movie/MovieList.kt b/domain/src/main/java/com/london/domain/entity/movie/MovieList.kt index b354c76cb..512850d9c 100644 --- a/domain/src/main/java/com/london/domain/entity/movie/MovieList.kt +++ b/domain/src/main/java/com/london/domain/entity/movie/MovieList.kt @@ -4,4 +4,4 @@ data class MovieList( val id: Int, val name: String, val moviesCount: Int = 0 -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/london/domain/entity/review/AuthorDetails.kt b/domain/src/main/java/com/london/domain/entity/review/AuthorDetails.kt index 739574bc4..b5b64c8b0 100644 --- a/domain/src/main/java/com/london/domain/entity/review/AuthorDetails.kt +++ b/domain/src/main/java/com/london/domain/entity/review/AuthorDetails.kt @@ -1,4 +1,5 @@ package com.london.domain.entity.review + data class AuthorDetails( val name: String, val username: String, diff --git a/domain/src/main/java/com/london/domain/entity/shared/ImagesEntity.kt b/domain/src/main/java/com/london/domain/entity/shared/ImagesEntity.kt index 7377d062f..23c45d32f 100644 --- a/domain/src/main/java/com/london/domain/entity/shared/ImagesEntity.kt +++ b/domain/src/main/java/com/london/domain/entity/shared/ImagesEntity.kt @@ -5,4 +5,4 @@ data class ImagesEntity( val id: Int, val logosUrl: List, val postersUrl: List -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/london/domain/entity/shared/PagedFetchResponse.kt b/domain/src/main/java/com/london/domain/entity/shared/PagedFetchResponse.kt index c08bc575d..afb04b6a2 100644 --- a/domain/src/main/java/com/london/domain/entity/shared/PagedFetchResponse.kt +++ b/domain/src/main/java/com/london/domain/entity/shared/PagedFetchResponse.kt @@ -5,4 +5,4 @@ data class PagedFetchResponse( val items: List, val totalPages: Int, val totalItems: Int -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/london/domain/entity/shared/RatedMedia.kt b/domain/src/main/java/com/london/domain/entity/shared/RatedMedia.kt index 631ea83b7..06428bc84 100644 --- a/domain/src/main/java/com/london/domain/entity/shared/RatedMedia.kt +++ b/domain/src/main/java/com/london/domain/entity/shared/RatedMedia.kt @@ -6,4 +6,4 @@ data class RatedMedia( val posterPath: String, val rating: Int, val mediaType: MediaType -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/london/domain/entity/theme/AppTheme.kt b/domain/src/main/java/com/london/domain/entity/theme/AppTheme.kt index 4d265baa8..20182b335 100644 --- a/domain/src/main/java/com/london/domain/entity/theme/AppTheme.kt +++ b/domain/src/main/java/com/london/domain/entity/theme/AppTheme.kt @@ -3,4 +3,4 @@ package com.london.domain.entity.theme enum class AppTheme { LIGHT, DARK -} \ No newline at end of file +} diff --git a/domain/src/main/java/com/london/domain/entity/toprated/TopRatedMedia.kt b/domain/src/main/java/com/london/domain/entity/toprated/TopRatedMedia.kt index dc51092e0..b35fd0dec 100644 --- a/domain/src/main/java/com/london/domain/entity/toprated/TopRatedMedia.kt +++ b/domain/src/main/java/com/london/domain/entity/toprated/TopRatedMedia.kt @@ -9,4 +9,4 @@ data class TopRatedMedia( val name: String, val genres: List, val mediaType: MediaType -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/london/domain/entity/tvshow/cast/TvShowCast.kt b/domain/src/main/java/com/london/domain/entity/tvshow/cast/TvShowCast.kt index dccb36219..9306331d7 100644 --- a/domain/src/main/java/com/london/domain/entity/tvshow/cast/TvShowCast.kt +++ b/domain/src/main/java/com/london/domain/entity/tvshow/cast/TvShowCast.kt @@ -3,4 +3,4 @@ package com.london.domain.entity.tvshow.cast data class TvShowCast( val cast: List, val id: Int? -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/london/domain/entity/tvshow/cast/TvShowCastMember.kt b/domain/src/main/java/com/london/domain/entity/tvshow/cast/TvShowCastMember.kt index 99986e6f5..c291c8f08 100644 --- a/domain/src/main/java/com/london/domain/entity/tvshow/cast/TvShowCastMember.kt +++ b/domain/src/main/java/com/london/domain/entity/tvshow/cast/TvShowCastMember.kt @@ -5,4 +5,4 @@ data class TvShowCastMember( val name: String, val profileUrl: String?, val roles: List, -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/london/domain/entity/tvshow/cast/TvShowRole.kt b/domain/src/main/java/com/london/domain/entity/tvshow/cast/TvShowRole.kt index 1edf52219..d660d2e6f 100644 --- a/domain/src/main/java/com/london/domain/entity/tvshow/cast/TvShowRole.kt +++ b/domain/src/main/java/com/london/domain/entity/tvshow/cast/TvShowRole.kt @@ -3,4 +3,4 @@ package com.london.domain.entity.tvshow.cast data class TvShowRole( val character: String, val episodeCount: Int -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/london/domain/entity/tvshow/episode/SeasonEpisodes.kt b/domain/src/main/java/com/london/domain/entity/tvshow/episode/SeasonEpisodes.kt index 14d41e7a7..ee0af63d1 100644 --- a/domain/src/main/java/com/london/domain/entity/tvshow/episode/SeasonEpisodes.kt +++ b/domain/src/main/java/com/london/domain/entity/tvshow/episode/SeasonEpisodes.kt @@ -3,4 +3,4 @@ package com.london.domain.entity.tvshow.episode data class SeasonEpisodes( val seasonId: String, val episodes: List -) \ No newline at end of file +) diff --git a/domain/src/main/java/com/london/domain/repository/AccountRepository.kt b/domain/src/main/java/com/london/domain/repository/AccountRepository.kt index 856f9ab19..bcc78846b 100644 --- a/domain/src/main/java/com/london/domain/repository/AccountRepository.kt +++ b/domain/src/main/java/com/london/domain/repository/AccountRepository.kt @@ -3,6 +3,9 @@ package com.london.domain.repository import com.london.domain.entity.account.AccountInfo interface AccountRepository { + suspend fun getAccountInfo(): AccountInfo + suspend fun getAccountId(): Int -} \ No newline at end of file + +} diff --git a/domain/src/main/java/com/london/domain/repository/ActorRepository.kt b/domain/src/main/java/com/london/domain/repository/ActorRepository.kt index 236f50c99..2d0ed9c38 100644 --- a/domain/src/main/java/com/london/domain/repository/ActorRepository.kt +++ b/domain/src/main/java/com/london/domain/repository/ActorRepository.kt @@ -7,9 +7,14 @@ import com.london.domain.entity.shared.PagedFetchResponse import com.london.domain.entity.tvshow.cast.TvShowCast interface ActorRepository { + suspend fun getActorDetailsById(id: Int): ActorDetails + suspend fun getActorImagesById(id: Int): ActorImageDetails + suspend fun getMovieActors(id: Int): List + suspend fun getTrendingActors(page: Int): PagedFetchResponse + suspend fun getTvShowActors(id: Int): TvShowCast } diff --git a/domain/src/main/java/com/london/domain/repository/AuthenticationRepository.kt b/domain/src/main/java/com/london/domain/repository/AuthenticationRepository.kt index d1cb4a290..8955dfb02 100644 --- a/domain/src/main/java/com/london/domain/repository/AuthenticationRepository.kt +++ b/domain/src/main/java/com/london/domain/repository/AuthenticationRepository.kt @@ -1,8 +1,13 @@ package com.london.domain.repository interface AuthenticationRepository { + suspend fun login(username: String, password: String): Boolean + suspend fun loginAsGuest(): Boolean + suspend fun logout(): Boolean + suspend fun isLoggedIn(): Boolean -} \ No newline at end of file + +} diff --git a/domain/src/main/java/com/london/domain/repository/CustomMovieListRepository.kt b/domain/src/main/java/com/london/domain/repository/CustomMovieListRepository.kt index dbd96eb16..3f5db6cb7 100644 --- a/domain/src/main/java/com/london/domain/repository/CustomMovieListRepository.kt +++ b/domain/src/main/java/com/london/domain/repository/CustomMovieListRepository.kt @@ -8,18 +8,30 @@ import kotlinx.coroutines.flow.Flow interface CustomMovieListRepository { suspend fun createMovieList(name: String): Boolean + suspend fun deleteMovieList(id: Int): Boolean + suspend fun getAllListedMovieIds(): List + fun getAllListedMovieIdsFlow(): Flow> + suspend fun addMovieToList(listId: Int, movieId: Int): Boolean + suspend fun removeMovieFromList(listId: Int, movieId: Int): Boolean + suspend fun getMovieListName(listId: Int): String + suspend fun getMovieLists(pageNumber: Int): PagedFetchResponse + suspend fun getMovieListDetails(listId: Int, pageNumber: Int): PagedFetchResponse + suspend fun isMovieListed(movieId: Int, forceRefresh: Boolean = false): Boolean + fun isMovieListedFlow(movieId: Int): Flow + suspend fun getMovieListIds(movieId: Int, forceRefresh: Boolean = false): List + fun getMovieListIdsFlow(movieId: Int): Flow> - suspend fun refreshMovieListCache() + suspend fun refreshMovieListCache() } diff --git a/domain/src/main/java/com/london/domain/repository/MovieRepository.kt b/domain/src/main/java/com/london/domain/repository/MovieRepository.kt index 5715b0918..38b37e637 100644 --- a/domain/src/main/java/com/london/domain/repository/MovieRepository.kt +++ b/domain/src/main/java/com/london/domain/repository/MovieRepository.kt @@ -15,18 +15,31 @@ import com.london.domain.entity.shared.Trending import com.london.domain.entity.toprated.TopRatedMedia interface MovieRepository { + suspend fun getMovieById(id: Int): MovieDetails + suspend fun getSimilarMoviesById(id: Int): List + suspend fun getMovieImagesById(id: Int): ImagesEntity + suspend fun getMovieReviews(movieId: Int, pageNumber: Int): PagedFetchResponse + suspend fun getMovieVideos(movieId: Int): List + suspend fun getActorMoviePicksById(id: Int): ActorMediaDetails + suspend fun getPopularMovies(): List + suspend fun getTrendingMovies(page: Int): PagedFetchResponse + suspend fun getTopRatedMovies(pageNumber: Int): PagedFetchResponse + suspend fun getFirstPageTopRatedMovies(): List + suspend fun getMoviesByGenre(genre: MovieGenre, pageNumber: Int): PagedFetchResponse + suspend fun getAllRatedMovies(): List + suspend fun deleteMovieRating(movieId: Int): Boolean suspend fun getUpcomingMoviesByGenre( @@ -42,4 +55,5 @@ interface MovieRepository { suspend fun getAccountMovieStatesById( id: Int, ): MediaStates + } diff --git a/domain/src/main/java/com/london/domain/repository/RecentRepository.kt b/domain/src/main/java/com/london/domain/repository/RecentRepository.kt index 2c836bd88..4d5ff9895 100644 --- a/domain/src/main/java/com/london/domain/repository/RecentRepository.kt +++ b/domain/src/main/java/com/london/domain/repository/RecentRepository.kt @@ -1,8 +1,13 @@ package com.london.domain.repository interface RecentRepository { + suspend fun insert(item: T) + suspend fun getAll(): List + suspend fun clearAll() + suspend fun delete(item: T) -} \ No newline at end of file + +} diff --git a/domain/src/main/java/com/london/domain/repository/RecentWatchedRepository.kt b/domain/src/main/java/com/london/domain/repository/RecentWatchedRepository.kt index 95bb3f296..96f3d2ab8 100644 --- a/domain/src/main/java/com/london/domain/repository/RecentWatchedRepository.kt +++ b/domain/src/main/java/com/london/domain/repository/RecentWatchedRepository.kt @@ -5,8 +5,13 @@ import com.london.domain.entity.tvshow.TvShow import kotlinx.coroutines.flow.Flow interface RecentWatchedRepository { + suspend fun getAllRecentWatchedMovies(): Flow> + suspend fun insertMovie(item: Movie) + suspend fun getAllRecentWatchedTvShows(): Flow> + suspend fun insertTvShow(item: TvShow) + } diff --git a/domain/src/main/java/com/london/domain/repository/SearchRepository.kt b/domain/src/main/java/com/london/domain/repository/SearchRepository.kt index 8936a84c2..0a55fbbd6 100644 --- a/domain/src/main/java/com/london/domain/repository/SearchRepository.kt +++ b/domain/src/main/java/com/london/domain/repository/SearchRepository.kt @@ -24,5 +24,7 @@ interface SearchRepository { ): PagedFetchResponse suspend fun incrementGenreInterest(genre: Genre, mediaType: String) + suspend fun getGenreInterestCounts(mediaType: String): List> + } diff --git a/domain/src/main/java/com/london/domain/repository/SessionTokenProvider.kt b/domain/src/main/java/com/london/domain/repository/SessionTokenProvider.kt index 8c6a5d5d2..bae249821 100644 --- a/domain/src/main/java/com/london/domain/repository/SessionTokenProvider.kt +++ b/domain/src/main/java/com/london/domain/repository/SessionTokenProvider.kt @@ -1,5 +1,7 @@ package com.london.domain.repository interface SessionTokenProvider { + fun getAuthenticationKey(): String? + } diff --git a/domain/src/main/java/com/london/domain/repository/TvShowRepository.kt b/domain/src/main/java/com/london/domain/repository/TvShowRepository.kt index ac8b78f7c..63bdf8525 100644 --- a/domain/src/main/java/com/london/domain/repository/TvShowRepository.kt +++ b/domain/src/main/java/com/london/domain/repository/TvShowRepository.kt @@ -16,14 +16,23 @@ import com.london.domain.entity.tvshow.episode.EpisodeDetails import com.london.domain.entity.tvshow.episode.SeasonEpisodes interface TvShowRepository { + suspend fun getTvShowDetailsById(id: Int): TvShowDetails + suspend fun getImagesTvShowById(id: Int): ImagesEntity + suspend fun getActorTvShowPicksById(id: Int): ActorMediaDetails + suspend fun getPopularTvShows(): List + suspend fun addTvShowById(id: Int, rating: Int): Boolean + suspend fun getAllRatedTvShows(): List + suspend fun deleteTvShowRating(tvShowId: Int): Boolean + suspend fun getTrendingTvShows(page: Int): PagedFetchResponse + suspend fun getFirstPageTopRatedTvShows(): List suspend fun getTopRatedTvShows( @@ -54,8 +63,11 @@ interface TvShowRepository { ): EpisodeDetails suspend fun getEpisodeVideos(tvShowId: Int, seasonNumber: Int, episodeNumber: Int): List + suspend fun getTvSeasonTrailer(tvShowId: Int, seasonNumber: Int): List + suspend fun getTvShowReviews(tvShowId: Int, pageNumber: Int): PagedFetchResponse + suspend fun getAccountTvShowStateById( id: Int, ): MediaStates @@ -65,4 +77,5 @@ interface TvShowRepository { seasonNumber: Int, episodeNumber: Int, ): MediaStates + } diff --git a/domain/src/main/java/com/london/domain/service/AppPreferencesService.kt b/domain/src/main/java/com/london/domain/service/AppPreferencesService.kt index 785fcf652..d5acaeb9f 100644 --- a/domain/src/main/java/com/london/domain/service/AppPreferencesService.kt +++ b/domain/src/main/java/com/london/domain/service/AppPreferencesService.kt @@ -6,6 +6,7 @@ import com.london.domain.entity.theme.AppTheme import kotlinx.coroutines.flow.StateFlow interface AppPreferencesService { + val hasOnboardingBeenShown: Boolean fun setOnBoardingShown() diff --git a/domain/src/main/java/com/london/domain/usecase/authentication/AuthenticationUseCase.kt b/domain/src/main/java/com/london/domain/usecase/authentication/AuthenticationUseCase.kt index acd4d9215..083eb1c0e 100644 --- a/domain/src/main/java/com/london/domain/usecase/authentication/AuthenticationUseCase.kt +++ b/domain/src/main/java/com/london/domain/usecase/authentication/AuthenticationUseCase.kt @@ -12,7 +12,7 @@ class AuthenticationUseCase @Inject constructor( suspend fun loginAsGuest() = repository.loginAsGuest() - suspend fun login(username: String, password: String) : Boolean { + suspend fun login(username: String, password: String): Boolean { return repository.login( username = username, password = password diff --git a/domain/src/main/java/com/london/domain/usecase/details/actor/GetActorUseCase.kt b/domain/src/main/java/com/london/domain/usecase/details/actor/GetActorUseCase.kt index 193f2c339..02c29d396 100644 --- a/domain/src/main/java/com/london/domain/usecase/details/actor/GetActorUseCase.kt +++ b/domain/src/main/java/com/london/domain/usecase/details/actor/GetActorUseCase.kt @@ -14,7 +14,7 @@ class GetActorUseCase @Inject constructor( private val movieRepository: MovieRepository, private val tvShowRepository: TvShowRepository, ) { - suspend fun getActorDetailsById(id: Int) : ActorDetails = actorRepository.getActorDetailsById(id) + suspend fun getActorDetailsById(id: Int): ActorDetails = actorRepository.getActorDetailsById(id) suspend fun getActorImagesById(id: Int): List = actorRepository.getActorImagesById(id).imageUrl @@ -22,9 +22,9 @@ class GetActorUseCase @Inject constructor( suspend fun getTrendingActors(page: Int): PagedFetchResponse = actorRepository.getTrendingActors(page) - suspend fun getActorTvShowPicksById(id: Int) : ActorMediaDetails = + suspend fun getActorTvShowPicksById(id: Int): ActorMediaDetails = tvShowRepository.getActorTvShowPicksById(id) - suspend fun getActorMoviePicksById(id: Int) : ActorMediaDetails = + suspend fun getActorMoviePicksById(id: Int): ActorMediaDetails = movieRepository.getActorMoviePicksById(id) } diff --git a/domain/src/main/java/com/london/domain/usecase/movielist/GetAvailableListsForMovie.kt b/domain/src/main/java/com/london/domain/usecase/movielist/GetAvailableListsForMovie.kt index c10d40917..101522ca8 100644 --- a/domain/src/main/java/com/london/domain/usecase/movielist/GetAvailableListsForMovie.kt +++ b/domain/src/main/java/com/london/domain/usecase/movielist/GetAvailableListsForMovie.kt @@ -30,4 +30,4 @@ class GetAvailableListsForMovie @Inject constructor( return allLists } -} \ No newline at end of file +} diff --git a/domain/src/main/java/com/london/domain/usecase/movielist/GetMovieListNameUseCase.kt b/domain/src/main/java/com/london/domain/usecase/movielist/GetMovieListNameUseCase.kt index 6a496d3e6..d1176a9b0 100644 --- a/domain/src/main/java/com/london/domain/usecase/movielist/GetMovieListNameUseCase.kt +++ b/domain/src/main/java/com/london/domain/usecase/movielist/GetMovieListNameUseCase.kt @@ -6,7 +6,6 @@ import javax.inject.Inject class GetMovieListNameUseCase @Inject constructor( private val customMovieListRepository: CustomMovieListRepository, ) { - suspend fun invoke(listId: Int): String = customMovieListRepository.getMovieListName(listId) -} \ No newline at end of file +} diff --git a/domain/src/main/java/com/london/domain/usecase/movielist/IsMovieListedUseCase.kt b/domain/src/main/java/com/london/domain/usecase/movielist/IsMovieListedUseCase.kt index fddee7b28..82a114add 100644 --- a/domain/src/main/java/com/london/domain/usecase/movielist/IsMovieListedUseCase.kt +++ b/domain/src/main/java/com/london/domain/usecase/movielist/IsMovieListedUseCase.kt @@ -12,5 +12,5 @@ class IsMovieListedUseCase @Inject constructor( forceRefresh: Boolean = false ): Boolean = repository.isMovieListed(movieId = movieId, forceRefresh = forceRefresh) - fun flow(movieId: Int): Flow = repository.isMovieListedFlow(movieId = movieId) + fun asFlow(movieId: Int): Flow = repository.isMovieListedFlow(movieId = movieId) } diff --git a/domain/src/main/java/com/london/domain/usecase/movielist/ManageGetMovieUseCase.kt b/domain/src/main/java/com/london/domain/usecase/movielist/ManageGetMovieUseCase.kt index 5025c2b40..71d6b1d35 100644 --- a/domain/src/main/java/com/london/domain/usecase/movielist/ManageGetMovieUseCase.kt +++ b/domain/src/main/java/com/london/domain/usecase/movielist/ManageGetMovieUseCase.kt @@ -14,4 +14,4 @@ class ManageGetMovieUseCase @Inject constructor( suspend fun getMovieListDetails(listId: Int, pageNumber: Int): PagedFetchResponse = customMovieListRepository.getMovieListDetails(listId, pageNumber) -} \ No newline at end of file +} diff --git a/domain/src/main/java/com/london/domain/usecase/recent/viewed/ManageRecentViewedUseCase.kt b/domain/src/main/java/com/london/domain/usecase/recent/viewed/ManageRecentViewedUseCase.kt index 7a66049ac..ba64ef4cb 100644 --- a/domain/src/main/java/com/london/domain/usecase/recent/viewed/ManageRecentViewedUseCase.kt +++ b/domain/src/main/java/com/london/domain/usecase/recent/viewed/ManageRecentViewedUseCase.kt @@ -7,7 +7,10 @@ import javax.inject.Inject class ManageRecentViewedUseCase @Inject constructor( private val repository: RecentRepository, ) { + suspend fun addToRecentViewed(item: RecentViewed) = repository.insert(item) + suspend fun getRecentViewed() = repository.getAll() + suspend fun clearRecentViewed() = repository.clearAll() } diff --git a/domain/src/main/java/com/london/domain/usecase/search/ManageSearchUseCase.kt b/domain/src/main/java/com/london/domain/usecase/search/ManageSearchUseCase.kt index 15df99654..162bce4a0 100644 --- a/domain/src/main/java/com/london/domain/usecase/search/ManageSearchUseCase.kt +++ b/domain/src/main/java/com/london/domain/usecase/search/ManageSearchUseCase.kt @@ -11,6 +11,7 @@ import javax.inject.Inject class ManageSearchUseCase @Inject constructor( private val repository: SearchRepository ) { + suspend fun searchForActors( name: String, pageNumber: Int diff --git a/domain/src/test/kotlin/com/london/domain/usecase/details/tvshow/GetTvShowUseCaseTest.kt b/domain/src/test/kotlin/com/london/domain/usecase/details/tvshow/GetTvShowUseCaseTest.kt index d498000fc..072c667f5 100644 --- a/domain/src/test/kotlin/com/london/domain/usecase/details/tvshow/GetTvShowUseCaseTest.kt +++ b/domain/src/test/kotlin/com/london/domain/usecase/details/tvshow/GetTvShowUseCaseTest.kt @@ -1,7 +1,6 @@ package com.london.domain.usecase.details.tvshow import com.google.common.truth.Truth.assertThat -import com.london.domain.entity.actor.Actor import com.london.domain.entity.genre.TvShowGenre import com.london.domain.entity.popular.PopularMedia import com.london.domain.entity.review.AuthorDetails @@ -536,13 +535,6 @@ class GetTvShowUseCaseTest { val mockTopRatedTvSeries = listOf(mockTv1, mockTv2) - private val ACTOR = Actor( - id = 1, - name = "Tom Holland", - profilePictureUrl = "", - characterName = "" - ) - private fun createMockTvShow(mockData: MockPopularMedia): PopularMedia = PopularMedia( id = mockData.id, @@ -715,4 +707,4 @@ class GetTvShowUseCaseTest { val rating: Double ) } -} \ No newline at end of file +} diff --git a/domain/src/test/kotlin/com/london/domain/usecase/movielist/GetAllMovieListsUseCaseTest.kt b/domain/src/test/kotlin/com/london/domain/usecase/movielist/GetAllMovieListsUseCaseTest.kt index 09b67515f..e1597c8a2 100644 --- a/domain/src/test/kotlin/com/london/domain/usecase/movielist/GetAllMovieListsUseCaseTest.kt +++ b/domain/src/test/kotlin/com/london/domain/usecase/movielist/GetAllMovieListsUseCaseTest.kt @@ -45,7 +45,6 @@ class GetAllMovieListsUseCaseTest { private companion object { const val LIST_ID = 10 - const val MOVIE_ID = 20 val movieLists = PagedFetchResponse( currentPage = 1, totalPages = 1, @@ -64,4 +63,4 @@ class GetAllMovieListsUseCaseTest { ) ) } -} \ No newline at end of file +} diff --git a/domain/src/test/kotlin/com/london/domain/usecase/search/ManageSearchUseCaseTest.kt b/domain/src/test/kotlin/com/london/domain/usecase/search/ManageSearchUseCaseTest.kt index 59cece1ed..7cdcd6a21 100644 --- a/domain/src/test/kotlin/com/london/domain/usecase/search/ManageSearchUseCaseTest.kt +++ b/domain/src/test/kotlin/com/london/domain/usecase/search/ManageSearchUseCaseTest.kt @@ -31,12 +31,12 @@ class ManageSearchUseCaseTest { //given coEvery { repository.searchForActors( - TvSHOW_NAME, + TV_SHOW_NAME, PAGE_NUMBER ) } returns actorsPagedResponse //when - val result = manageSearchUseCase.searchForActors(TvSHOW_NAME, PAGE_NUMBER) + val result = manageSearchUseCase.searchForActors(TV_SHOW_NAME, PAGE_NUMBER) //then assertThat(result).isEqualTo(actorsPagedResponse) } @@ -86,19 +86,19 @@ class ManageSearchUseCaseTest { //given coEvery { repository.searchForTvShows( - TvSHOW_NAME, + TV_SHOW_NAME, PAGE_NUMBER ) } returns tvShowsPagedResponse() //when - val result = manageSearchUseCase.searchForTvShows(TvSHOW_NAME, PAGE_NUMBER) + val result = manageSearchUseCase.searchForTvShows(TV_SHOW_NAME, PAGE_NUMBER) //then assertThat(result).isEqualTo(tvShowsPagedResponse()) } private companion object { private const val MOVIE_NAME = "Movie" - private const val TvSHOW_NAME = "Tom" + private const val TV_SHOW_NAME = "Tom" private const val PAGE_NUMBER = 1 private fun tvShowsPagedResponse(): PagedFetchResponse = PagedFetchResponse( @@ -110,7 +110,7 @@ class ManageSearchUseCaseTest { private val tvShow = TvShow( id = 1, - name = TvSHOW_NAME, + name = TV_SHOW_NAME, releaseYear = 2024, rating = 8, genres = listOf(TvShowGenre.ALL), @@ -143,4 +143,4 @@ class ManageSearchUseCaseTest { totalItems = 1 ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/AccountContract.kt b/presentation/src/main/java/com/london/presentation/feature/account/AccountContract.kt index 158d0d256..207c0cac7 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/AccountContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/AccountContract.kt @@ -3,10 +3,10 @@ package com.london.presentation.feature.account import com.london.domain.entity.contentrestriction.ContentRestrictionLevel interface AccountContract { - fun onWatchingHistoryClick() fun onMyRatingClick() - fun onContentRestrictionClick() fun onChangePasswordClick() + fun onWatchingHistoryClick() + fun onContentRestrictionClick() // appearance bottom sheet fun onAppearanceClick() @@ -17,16 +17,15 @@ interface AccountContract { // Language Bottom Sheet fun onLanguageClick() - fun onEnglishSelected() fun onArabicSelected() + fun onEnglishSelected() fun onLanguageSettingsSave() // Logout Bottom Sheet - fun onLogoutConfirmed() - - fun onUserMenuClick() + fun onLoginClick() fun onLogoutClick() + fun onUserMenuClick() + fun onLogoutConfirmed() fun onBottomSheetDismiss() - fun onLoginClick() fun onContentRestrictionSave(level: ContentRestrictionLevel) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/AccountEffect.kt b/presentation/src/main/java/com/london/presentation/feature/account/AccountEffect.kt index b1fcc8ae9..7b88efa43 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/AccountEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/AccountEffect.kt @@ -9,4 +9,4 @@ sealed interface AccountEffect { const val FORGOT_PASSWORD_URL = "https://www.themoviedb.org/reset-password" } } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/AccountUiState.kt b/presentation/src/main/java/com/london/presentation/feature/account/AccountUiState.kt index 98f4d4f61..ac5b81fe8 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/AccountUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/AccountUiState.kt @@ -29,4 +29,4 @@ sealed interface ActiveBottomSheet { data object Language : ActiveBottomSheet data object Appearance : ActiveBottomSheet data object ContentRestriction : ActiveBottomSheet -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/AccountViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/account/AccountViewModel.kt index fa42a5878..1b54f4d12 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/AccountViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/AccountViewModel.kt @@ -23,11 +23,15 @@ class AccountViewModel @Inject constructor( AccountContract { init { - checkUserLoginStatus() + getAccountInfo() + } + + private fun getAccountInfo() { + initializeAppTheme() fetchAndSetUsername() - observeContentRestrictionLevel() + checkUserLoginStatus() initializeAppLanguage() - initializeAppTheme() + observeContentRestrictionLevel() } @@ -201,4 +205,5 @@ class AccountViewModel @Inject constructor( } ) } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/AppearanceBottomSheet.kt b/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/AppearanceBottomSheet.kt index 28d581c65..ee44b1ff6 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/AppearanceBottomSheet.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/AppearanceBottomSheet.kt @@ -48,4 +48,4 @@ fun AppearanceBottomSheet( onClick = onLightModeSelected ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/ContentRestrictionBottomSheet.kt b/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/ContentRestrictionBottomSheet.kt index 0c64b85c6..c3e7871e9 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/ContentRestrictionBottomSheet.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/ContentRestrictionBottomSheet.kt @@ -117,4 +117,4 @@ private fun ContentRestrictionOption( ) } } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/LanguageBottomSheet.kt b/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/LanguageBottomSheet.kt index b3e24c9bc..22662a940 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/LanguageBottomSheet.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/LanguageBottomSheet.kt @@ -48,4 +48,4 @@ fun LanguageBottomSheet( onClick = onArabicSelected ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/LogoutBottomSheet.kt b/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/LogoutBottomSheet.kt index deab3c6f7..60ad1592b 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/LogoutBottomSheet.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/LogoutBottomSheet.kt @@ -37,4 +37,4 @@ fun LogoutBottomSheet( modifier = Modifier.padding(top = 24.dp, bottom = 24.dp) ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/base/BaseBottomSheet.kt b/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/base/BaseBottomSheet.kt index 766912291..e00b2f51f 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/base/BaseBottomSheet.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/bottomsheet/base/BaseBottomSheet.kt @@ -34,7 +34,6 @@ import com.london.designsystem.component.button.PrimaryButton import com.london.designsystem.component.rememberModalBottomSheetState import com.london.designsystem.theme.NovixTheme - @Composable fun BaseBottomSheet( title: String, @@ -104,6 +103,7 @@ fun BaseBottomSheet( icon = null ) } + BottomSheetButtonType.OUTLINE -> { OutlineButton( text = it.text, @@ -115,6 +115,7 @@ fun BaseBottomSheet( icon = null ) } + BottomSheetButtonType.NONE -> {} } } @@ -158,7 +159,6 @@ private fun BottomSheetHeader( } } - enum class BottomSheetButtonType { PRIMARY, OUTLINE, @@ -170,4 +170,4 @@ data class BottomSheetButton( val onClick: () -> Unit, val type: BottomSheetButtonType = BottomSheetButtonType.PRIMARY, val isLoading: Boolean = false -) \ No newline at end of file +) diff --git a/presentation/src/main/java/com/london/presentation/feature/account/components/accountMenuItem.kt b/presentation/src/main/java/com/london/presentation/feature/account/components/AccountMenuItem.kt similarity index 99% rename from presentation/src/main/java/com/london/presentation/feature/account/components/accountMenuItem.kt rename to presentation/src/main/java/com/london/presentation/feature/account/components/AccountMenuItem.kt index 2905d4280..59e96a6ef 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/components/accountMenuItem.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/components/AccountMenuItem.kt @@ -91,4 +91,4 @@ private fun AccountMenuItemIcon( modifier = Modifier.size(24.dp) ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/components/loggedInContent.kt b/presentation/src/main/java/com/london/presentation/feature/account/components/LoggedInContent.kt similarity index 99% rename from presentation/src/main/java/com/london/presentation/feature/account/components/loggedInContent.kt rename to presentation/src/main/java/com/london/presentation/feature/account/components/LoggedInContent.kt index 072de7038..921b23d78 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/components/loggedInContent.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/components/LoggedInContent.kt @@ -94,4 +94,4 @@ private fun AccountMenuDivider() { color = NovixTheme.colors.stroke, thickness = 1.dp ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/components/notLoggedInContent.kt b/presentation/src/main/java/com/london/presentation/feature/account/components/NotLoggedInContent.kt similarity index 98% rename from presentation/src/main/java/com/london/presentation/feature/account/components/notLoggedInContent.kt rename to presentation/src/main/java/com/london/presentation/feature/account/components/NotLoggedInContent.kt index e3bd96fbd..03f6cd37e 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/components/notLoggedInContent.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/components/NotLoggedInContent.kt @@ -70,10 +70,10 @@ fun NotLoggedInContent( @ThemePreviews @Composable -fun Preview() { +private fun Preview() { NovixTheme { NotLoggedInContent( onLoginClick = {} ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/components/userProfileSection.kt b/presentation/src/main/java/com/london/presentation/feature/account/components/UserProfileSection.kt similarity index 99% rename from presentation/src/main/java/com/london/presentation/feature/account/components/userProfileSection.kt rename to presentation/src/main/java/com/london/presentation/feature/account/components/UserProfileSection.kt index 15f4e485b..19c337497 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/components/userProfileSection.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/components/UserProfileSection.kt @@ -184,4 +184,4 @@ private fun LogoutMenuItem(onLogoutClick: () -> Unit) { color = NovixTheme.colors.redAccent ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingContract.kt b/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingContract.kt index df2c70252..3b2df0ba0 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingContract.kt @@ -1,8 +1,8 @@ package com.london.presentation.feature.account.rating interface MyRatingContract { - fun onRetryClick() fun onBackClick() + fun onRetryClick() fun onItemClick(id: Int) fun onMovieClick(id: Int) fun onTvShowClick(id: Int) diff --git a/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingScreen.kt b/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingScreen.kt index b89672d5c..32bb0ccce 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingScreen.kt @@ -142,7 +142,7 @@ private fun RatingSnackBar(state: MyRatingUiState) { } @Composable -fun RatingChipsRow( +private fun RatingChipsRow( selected: RatingCategory, onSelect: (RatingCategory) -> Unit, modifier: Modifier = Modifier @@ -171,4 +171,4 @@ private fun Preview() = NovixTheme { onNavigateToTvShowDetails = {}, onNavigateBack = {} ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingViewModel.kt index e9c699e4a..3d4be0f8c 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingViewModel.kt @@ -95,4 +95,5 @@ class MyRatingViewModel @Inject constructor( emitEffect(effect) } } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/account/rating/RatingCategory.kt b/presentation/src/main/java/com/london/presentation/feature/account/rating/RatingCategory.kt index 68337eb5f..a3409b758 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/rating/RatingCategory.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/rating/RatingCategory.kt @@ -7,4 +7,4 @@ enum class RatingCategory(@StringRes val title: Int) { All(R.string.all), Movies(R.string.Movies), TvShows(R.string.TV_Shows) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/authentication/login/LoginContract.kt b/presentation/src/main/java/com/london/presentation/feature/authentication/login/LoginContract.kt index 02a895f7b..a53bb80fc 100644 --- a/presentation/src/main/java/com/london/presentation/feature/authentication/login/LoginContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/authentication/login/LoginContract.kt @@ -5,12 +5,10 @@ import androidx.compose.ui.text.input.TextFieldValue interface LoginContract { fun onLoginClick() fun onNavigateBack() - - fun onUsernameChanged(username: TextFieldValue) - fun onPasswordChanged(password: TextFieldValue) - fun onPasswordVisibilityToggled() - fun onLoginAsGuestClick() fun onCreateAccountClick() fun onForgotPasswordClick() -} \ No newline at end of file + fun onPasswordVisibilityToggled() + fun onUsernameChanged(username: TextFieldValue) + fun onPasswordChanged(password: TextFieldValue) +} diff --git a/presentation/src/main/java/com/london/presentation/feature/authentication/login/LoginViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/authentication/login/LoginViewModel.kt index 510a1eb56..e54d3315b 100644 --- a/presentation/src/main/java/com/london/presentation/feature/authentication/login/LoginViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/authentication/login/LoginViewModel.kt @@ -104,7 +104,8 @@ class LoginViewModel @Inject constructor( handleLoginError() }, onError = { handleLoginError() }, - onCompleted = { updateState { copy(isLoading = false) } + onCompleted = { + updateState { copy(isLoading = false) } } ) } diff --git a/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationContract.kt b/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationContract.kt index cbd99c60d..7812a1d62 100644 --- a/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationContract.kt @@ -5,4 +5,4 @@ interface RegistrationContract { fun onUrlChanged(url: String) fun onPageLoaded(url: String?) fun shouldInterceptUrl(url: String): Boolean -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationEffect.kt b/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationEffect.kt index 5d43cd71b..f929b1605 100644 --- a/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationEffect.kt @@ -3,4 +3,4 @@ package com.london.presentation.feature.authentication.register sealed class RegistrationEffect { data object NavigateBack : RegistrationEffect() data object RegistrationComplete : RegistrationEffect() -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationScreen.kt b/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationScreen.kt index 7f01ac073..e1dab7709 100644 --- a/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationScreen.kt @@ -20,8 +20,8 @@ fun RegistrationScreen( onRegisterComplete: () -> Unit, viewModel: RegistrationViewModel = hiltViewModel() ) { - val uiState by viewModel.state.collectAsStateWithLifecycle() val effect by viewModel.effect.collectAsState(null) + val uiState by viewModel.state.collectAsStateWithLifecycle() effect?.Listen { currentEffect -> when (currentEffect) { @@ -96,4 +96,3 @@ private fun WebView.configureWebViewSettings() { displayZoomControls = false } } - diff --git a/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationUiState.kt b/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationUiState.kt index e821a3b61..1183d3952 100644 --- a/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationUiState.kt @@ -10,4 +10,4 @@ data class RegistrationUiState( private object Register { const val REGISTER_URL = "https://www.themoviedb.org/signup" -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationViewModel.kt index f2839f6de..64be24e89 100644 --- a/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/authentication/register/RegistrationViewModel.kt @@ -49,14 +49,13 @@ class RegistrationViewModel @Inject constructor() : } } - private fun isCancelUrl(url: String): Boolean { return url.contains(CANCEL_LOWERCASE, ignoreCase = true) || - url.contains(BACK, ignoreCase = true) || - url.contains(CLOSE, ignoreCase = true) || - url.contains(DISMISS, ignoreCase = true) || - url.contains(EXIT, ignoreCase = true) || - url == URL + url.contains(BACK, ignoreCase = true) || + url.contains(CLOSE, ignoreCase = true) || + url.contains(DISMISS, ignoreCase = true) || + url.contains(EXIT, ignoreCase = true) || + url == URL } private fun isUrlAllowed(url: String): Boolean { @@ -87,7 +86,7 @@ class RegistrationViewModel @Inject constructor() : ) url.contains(BASE_URL) && - completionUrls.any { completionUrl -> url.contains(completionUrl) } + completionUrls.any { completionUrl -> url.contains(completionUrl) } } catch (e: Exception) { false @@ -96,10 +95,10 @@ class RegistrationViewModel @Inject constructor() : private fun isRegistrationCompleteUrl(url: String): Boolean { return url.contains(ACCOUNT_VERIFY) || - url.contains(REGISTRATION_SUCCESS) || - url.contains(SIGNUP_COMPLETE) || - url.contains(WELCOME) || - (url.contains(BASE_URL) && url.contains("u/")) + url.contains(REGISTRATION_SUCCESS) || + url.contains(SIGNUP_COMPLETE) || + url.contains(WELCOME) || + (url.contains(BASE_URL) && url.contains("u/")) } private fun isAllowedRegistrationUrl(url: String): Boolean { @@ -117,8 +116,7 @@ class RegistrationViewModel @Inject constructor() : return url.contains(LOGIN) && url.contains(SUCCESS) } - private companion object Registration - { + private companion object Registration { const val LOGIN = "login" const val SUCCESS = "success" const val CANCEL_LOWERCASE = "cancel" @@ -129,16 +127,16 @@ class RegistrationViewModel @Inject constructor() : const val EXIT = "exit" const val WELCOME = "welcome" const val URL = "https://www.themoviedb.org/" - const val WWW_SIGNUP ="https://www.themoviedb.org/signup" + const val WWW_SIGNUP = "https://www.themoviedb.org/signup" const val SIGNUP = "https://themoviedb.org/signup" const val WWW_ACCOUNT_SIGNUP = "https://www.themoviedb.org/account/signup" - const val ACCOUNT_SIGNUP ="https://themoviedb.org/account/signup" + const val ACCOUNT_SIGNUP = "https://themoviedb.org/account/signup" const val SITE = "https://themoviedb.org/" - const val WWW_LOGIN_WITH_SITE ="https://www.themoviedb.org/login" + const val WWW_LOGIN_WITH_SITE = "https://www.themoviedb.org/login" const val LOGIN_WITH_SITE = "https://themoviedb.org/login" const val ACCOUNT_VERIFY = "account/verify" - const val REGISTRATION_SUCCESS ="registration/success" - const val SIGNUP_COMPLETE ="signup/complete" + const val REGISTRATION_SUCCESS = "registration/success" + const val SIGNUP_COMPLETE = "signup/complete" const val BASE_URL = "themoviedb.org" } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesContract.kt b/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesContract.kt index b33c3b55f..5d5ecd5e3 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesContract.kt @@ -5,7 +5,6 @@ import com.london.presentation.shared.genre.MovieGenreUi import com.london.presentation.shared.genre.TvShowGenreUi interface CategoriesContract { - fun onMovieGenreClick(genre: MovieGenreUi) fun onTvShowGenreClick(genre: TvShowGenreUi) fun onCategoryClick(category: MediaCategory) diff --git a/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesEffect.kt b/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesEffect.kt index 4960a7b1f..932038f66 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesEffect.kt @@ -3,9 +3,7 @@ package com.london.presentation.feature.category.main import com.london.presentation.shared.genre.MovieGenreUi import com.london.presentation.shared.genre.TvShowGenreUi - interface CategoriesEffect { - data class MovieCategoryNavigation(val movieGenre: MovieGenreUi) : CategoriesEffect data class TvShowCategoryNavigation(val tvShowGenre: TvShowGenreUi) : CategoriesEffect } diff --git a/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesScreen.kt b/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesScreen.kt index 73cade99f..028d793d1 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesScreen.kt @@ -43,7 +43,6 @@ fun CategoriesScreen( onNavigateToTvShowCategory: (TvShowGenreUi) -> Unit, viewModel: CategoriesViewModel = hiltViewModel() ) { - val state by viewModel.state.collectAsStateWithLifecycle() val effect by viewModel.effect.collectAsState(null) diff --git a/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesUiState.kt b/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesUiState.kt index 324e9a625..09885ad6f 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesUiState.kt @@ -4,7 +4,6 @@ import com.london.presentation.shared.MediaCategory import com.london.presentation.shared.genre.MovieGenreUi import com.london.presentation.shared.genre.TvShowGenreUi - data class CategoriesUiState( val selectedCategory: MediaCategory = MediaCategory.Movies, diff --git a/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesViewModel.kt index e2b580877..419667630 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesViewModel.kt @@ -18,4 +18,5 @@ class CategoriesViewModel : BaseViewModel(C if (category == state.value.selectedCategory) return updateState { copy(selectedCategory = category) } } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryContract.kt b/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryContract.kt index 2c0976dba..c005e8d48 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryContract.kt @@ -1,7 +1,6 @@ package com.london.presentation.feature.category.movie interface MovieCategoryContract { - fun onBack() fun onMovieClick(movieId: Int) fun onBookmarkSheetDismiss() diff --git a/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryEffect.kt b/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryEffect.kt index 075d8ef9b..a69a3241e 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryEffect.kt @@ -1,7 +1,6 @@ package com.london.presentation.feature.category.movie sealed interface MovieCategoryEffect { - data object BackNavigation : MovieCategoryEffect data class MovieDetailsNavigation(val movieId: Int) : MovieCategoryEffect } diff --git a/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryScreen.kt b/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryScreen.kt index 6107f227b..176502033 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryScreen.kt @@ -29,7 +29,6 @@ fun MoviesByCategoryScreen( onNavigateToMovieDetails: (Int) -> Unit, viewModel: MovieCategoryViewModel = hiltViewModel() ) { - val state by viewModel.state.collectAsStateWithLifecycle() val effect by viewModel.effect.collectAsState(null) diff --git a/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryViewModel.kt index 2082ed3ea..dde1f28a7 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryViewModel.kt @@ -17,8 +17,8 @@ import javax.inject.Inject @HiltViewModel class MovieCategoryViewModel @Inject constructor( - private val getMovieUseCase: GetMovieUseCase, - savedStateHandle: SavedStateHandle + savedStateHandle: SavedStateHandle, + private val getMovieUseCase: GetMovieUseCase ) : BaseViewModel(MovieCategoryUiState()), MovieCategoryContract { @@ -86,4 +86,5 @@ class MovieCategoryViewModel @Inject constructor( private fun onInitializeMoviesFailed(errorState: ErrorState) = updateState { copy(error = errorState) } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryContract.kt b/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryContract.kt index c22e9dbe7..aa63e5d21 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryContract.kt @@ -1,7 +1,6 @@ package com.london.presentation.feature.category.tvshow interface TvShowCategoryContract { - fun onBack() fun onSavedClick(tvShowId: Int) fun onTvShowClick(tvShowId: Int) diff --git a/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryEffect.kt b/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryEffect.kt index d33575a22..4e5dfb13d 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryEffect.kt @@ -1,7 +1,6 @@ package com.london.presentation.feature.category.tvshow sealed interface TvShowCategoryEffect { - data object BackNavigation : TvShowCategoryEffect data class TvShowDetailsNavigation(val tvShowId: Int) : TvShowCategoryEffect } diff --git a/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryScreen.kt b/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryScreen.kt index 684427ec6..f69b84ee6 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryScreen.kt @@ -28,7 +28,6 @@ fun TvShowByCategoryScreen( onNavigateToTvShowDetails: (Int) -> Unit, viewModel: TvShowCategoryViewModel = hiltViewModel(), ) { - val state by viewModel.state.collectAsStateWithLifecycle() val effect by viewModel.effect.collectAsState(null) diff --git a/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryUiState.kt b/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryUiState.kt index 34eb07747..266a62817 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryUiState.kt @@ -8,8 +8,8 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow data class TvShowCategoryUiState( - val genre: TvShowGenreUi = TvShowGenreUi.All, val error: ErrorState? = null, val isLoading: Boolean = false, + val genre: TvShowGenreUi = TvShowGenreUi.All, val tvShowFlow: Flow> = flow {} ) diff --git a/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryViewModel.kt index 2450d71cc..8a7ca8cdc 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryViewModel.kt @@ -17,8 +17,8 @@ import javax.inject.Inject @HiltViewModel class TvShowCategoryViewModel @Inject constructor( - private val managerTvShowDetailsUseCase: GetTvShowUseCase, - savedStateHandle: SavedStateHandle + savedStateHandle: SavedStateHandle, + private val managerTvShowDetailsUseCase: GetTvShowUseCase ) : BaseViewModel(TvShowCategoryUiState()), TvShowCategoryContract { @@ -69,4 +69,5 @@ class TvShowCategoryViewModel @Inject constructor( private fun onInitializeTvShowsFailed(errorState: ErrorState) = updateState { copy(error = errorState) } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorDetailsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorDetailsScreen.kt index 9960201c9..a3c2020d6 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorDetailsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorDetailsScreen.kt @@ -68,10 +68,10 @@ import com.london.presentation.utils.toLocalizedNumbers fun ActorDetailsScreen( onNavigateBack: () -> Unit, onNavigateToGallery: (Int) -> Unit, - onNavigateToTopMoviePicks: (Int) -> Unit, onNavigateToMovieDetails: (Int) -> Unit, - onNavigateToTopTvShowPicks: (Int) -> Unit, + onNavigateToTopMoviePicks: (Int) -> Unit, onNavigateToTvShowDetails: (Int) -> Unit, + onNavigateToTopTvShowPicks: (Int) -> Unit, viewModel: ActorDetailsViewModel = hiltViewModel(), ) { val effect by viewModel.effect.collectAsState(null) @@ -101,7 +101,6 @@ fun ActorDetailsScreen( } } - @Composable private fun Content( uiState: ActorDetailsUiState, @@ -291,7 +290,7 @@ private fun TvShowsSection( } @Composable -fun TopMoviesPicksList( +private fun TopMoviesPicksList( movies: List, onNavigateToMoviePicks: (Int) -> Unit, onManageBookmarkClicked: (Int) -> Unit @@ -316,7 +315,7 @@ fun TopMoviesPicksList( } @Composable -fun TopTvShowsPicksList( +private fun TopTvShowsPicksList( tvShow: List, onNavigateToTvShowPicks: (Int) -> Unit ) { @@ -341,7 +340,7 @@ fun TopTvShowsPicksList( } @Composable -fun ActorGallery(images: List) { +private fun ActorGallery(images: List) { LazyRow( horizontalArrangement = Arrangement.spacedBy(8.dp), contentPadding = PaddingValues(horizontal = 16.dp), @@ -452,7 +451,7 @@ private fun hasOtherContent(uiState: ActorDetailsUiState): Boolean { @Preview @Composable -fun Preview() { +private fun Preview() { NovixTheme { ActorDetailsScreen( onNavigateBack = {}, diff --git a/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorDetailsViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorDetailsViewModel.kt index 73501abca..00fd4fd9d 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorDetailsViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorDetailsViewModel.kt @@ -10,8 +10,8 @@ import javax.inject.Inject @HiltViewModel class ActorDetailsViewModel @Inject constructor( - private val getActorUseCase: GetActorUseCase, savedStateHandle: SavedStateHandle, + private val getActorUseCase: GetActorUseCase ) : BaseViewModel(ActorDetailsUiState()), ActorDetailsContract { @@ -46,6 +46,7 @@ class ActorDetailsViewModel @Inject constructor( override fun onTopTvShowPicksClick(actorId: Int) { emitEffect(ActorEffect.TopTvShowPicksNavigation(actorId)) } + override fun onTvShowScreenClick(tvShowId: Int) { emitEffect(ActorEffect.TvShowScreenNavigation(tvShowId)) } @@ -68,7 +69,7 @@ class ActorDetailsViewModel @Inject constructor( } } - private fun getActorInformation(){ + private fun getActorInformation() { getActorImage() getActorDetails() getActorMovieDetails() @@ -117,7 +118,7 @@ class ActorDetailsViewModel @Inject constructor( getActorUseCase.getActorTvShowPicksById(actorId ?: 0) }, onStart = { updateState { copy(isLoading = true) } }, - onSuccess = { tvShows -> updateState { copy( actorTvShowDetails = tvShows ) } }, + onSuccess = { tvShows -> updateState { copy(actorTvShowDetails = tvShows) } }, onError = { errorState -> updateState { copy(error = errorState) } }, onCompleted = { updateState { copy(isLoading = false) } }, ) diff --git a/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorEffect.kt b/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorEffect.kt index 3dc7eb725..3614a2cd2 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorEffect.kt @@ -3,8 +3,8 @@ package com.london.presentation.feature.details.actor sealed interface ActorEffect { data object BackNavigation : ActorEffect data class GalleryNavigation(val actorId: Int) : ActorEffect - data class TopTvShowPicksNavigation(val actorId: Int) : ActorEffect data class MovieScreenNavigation(val movieId: Int) : ActorEffect data class TopMoviePicksNavigation(val actorId: Int) : ActorEffect data class TvShowScreenNavigation(val tvShowId: Int) : ActorEffect + data class TopTvShowPicksNavigation(val actorId: Int) : ActorEffect } diff --git a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/gallery/ActorsGalleryScreen.kt b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/gallery/ActorsGalleryScreen.kt index e74065efd..50673f17c 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/gallery/ActorsGalleryScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/gallery/ActorsGalleryScreen.kt @@ -87,7 +87,7 @@ private fun Content( @Composable private fun GalleryContent( uiState: ActorsGalleryUiState -){ +) { LazyVerticalGrid( columns = GridCells.Adaptive(minSize = 104.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), @@ -114,4 +114,4 @@ private fun GalleryContent( ) } } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/gallery/ActorsGalleryViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/gallery/ActorsGalleryViewModel.kt index 3e3d0d8c7..a617dd607 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/gallery/ActorsGalleryViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/gallery/ActorsGalleryViewModel.kt @@ -11,8 +11,8 @@ import javax.inject.Inject @HiltViewModel class ActorsGalleryViewModel @Inject constructor( savedStateHandle: SavedStateHandle, - private val getActorUseCase: GetActorUseCase, - ) : BaseViewModel(ActorsGalleryUiState()), + private val getActorUseCase: GetActorUseCase +) : BaseViewModel(ActorsGalleryUiState()), ActorsGalleryContract { private val args = savedStateHandle.getArgs() @@ -42,4 +42,5 @@ class ActorsGalleryViewModel @Inject constructor( override fun onBackClick() { emitEffect(ActorsGalleryEffect.BackNavigation) } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/topmoviespicks/TopMoviesPicksViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/topmoviespicks/TopMoviesPicksViewModel.kt index f50256b02..9b6663276 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/topmoviespicks/TopMoviesPicksViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/topmoviespicks/TopMoviesPicksViewModel.kt @@ -10,8 +10,8 @@ import javax.inject.Inject @HiltViewModel class TopMoviesPicksViewModel @Inject constructor( - private val getActorUseCase: GetActorUseCase, savedStateHandle: SavedStateHandle, + private val getActorUseCase: GetActorUseCase ) : BaseViewModel(TopMoviesPicksUiState()), TopMoviesPicksContract { @@ -63,4 +63,5 @@ class TopMoviesPicksViewModel @Inject constructor( onCompleted = { updateState { copy(isLoading = false) } }, ) } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/toptvshowspicks/TopTvShowsPicksViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/toptvshowspicks/TopTvShowsPicksViewModel.kt index 6ec8b8c8d..9930bfba9 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/toptvshowspicks/TopTvShowsPicksViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/toptvshowspicks/TopTvShowsPicksViewModel.kt @@ -11,7 +11,7 @@ import javax.inject.Inject @HiltViewModel class TopTvShowsPicksViewModel @Inject constructor( savedStateHandle: SavedStateHandle, - private val getActorUseCase: GetActorUseCase, + private val getActorUseCase: GetActorUseCase ) : BaseViewModel( TopTvShowsPicksUiState() ), TopTvShowsPicksContract { diff --git a/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsContract.kt b/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsContract.kt index c7a06cb94..4a8dbba5f 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsContract.kt @@ -4,9 +4,9 @@ import com.london.domain.entity.shared.MediaType import com.london.presentation.shared.genre.MovieGenreUi interface MovieDetailsContract { - fun onRetryClick() fun onBackClick() fun onLoginClick() + fun onRetryClick() fun onExpandClick() fun onRateBottomSheetClick() fun onMovieClick(movieId: Int) diff --git a/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsEffect.kt b/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsEffect.kt index 63e995958..0faaf318b 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsEffect.kt @@ -10,4 +10,4 @@ sealed interface MovieDetailsEffect { data class ActorNavigation(val actorId: Int) : MovieDetailsEffect data class GenreNavigation(val genre: MovieGenreUi) : MovieDetailsEffect data class ReviewsNavigation(val movieId: Int, val mediaType: MediaType) : MovieDetailsEffect -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsScreen.kt index 408a1e7a7..dea618826 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsScreen.kt @@ -86,10 +86,10 @@ import com.london.presentation.utils.toLocalizedNumbers fun MovieDetailsScreen( onNavigateBack: () -> Unit, onNavigateToLogin: () -> Unit, - onNavigateToMovieCategory: (MovieGenreUi) -> Unit, onNavigateToMovie: (Int) -> Unit, onNavigateToActor: (Int) -> Unit, onNavigateToReviews: (Int, MediaType) -> Unit, + onNavigateToMovieCategory: (MovieGenreUi) -> Unit, viewModel: MovieDetailsViewModel = hiltViewModel() ) { val state by viewModel.state.collectAsStateWithLifecycle() diff --git a/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsUiState.kt b/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsUiState.kt index c3e17dafa..e3bae47b6 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsUiState.kt @@ -21,11 +21,11 @@ data class MovieDetailsUiState( val movieOverview: String = "", val isGuestUser: Boolean = false, val actors: List = listOf(), - val movieGenres: List = listOf(), val isSuccessfullyRated: Boolean? = null, val movieImages: List = listOf(), val similarMovies: List = listOf(), val isRateBottomSheetVisible: Boolean = false, + val movieGenres: List = listOf(), val isGuestUserBottomSheetVisible: Boolean = false, val isBookmarkSheetVisible: Boolean = false, val bookmarkedMovieId: Int = 0, diff --git a/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsViewModel.kt index e7128db81..41397477e 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsViewModel.kt @@ -21,12 +21,12 @@ import javax.inject.Inject @HiltViewModel class MovieDetailsViewModel @Inject constructor( + savedStateHandle: SavedStateHandle, private val movieDetails: GetMovieUseCase, - private val manageRecentMovieWatchedUseCase: ManageRecentMovieWatchedUseCase, - private val manageRecentViewedUseCase: ManageRecentViewedUseCase, private val ratingUseCase: ManageRatingUseCase, private val authenticationUseCase: AuthenticationUseCase, - savedStateHandle: SavedStateHandle + private val manageRecentViewedUseCase: ManageRecentViewedUseCase, + private val manageRecentMovieWatchedUseCase: ManageRecentMovieWatchedUseCase ) : BaseViewModel(MovieDetailsUiState()), MovieDetailsContract { @@ -62,9 +62,9 @@ class MovieDetailsViewModel @Inject constructor( } private suspend fun fetchMainMovieData(): MainMovieData { - val details = movieDetails.getMovieDetails(movieId) - val images = movieDetails.getMovieImages(movieId) val cast = movieDetails.getMovieCast(movieId) + val images = movieDetails.getMovieImages(movieId) + val details = movieDetails.getMovieDetails(movieId) return MainMovieData(details, images, cast) } @@ -263,4 +263,5 @@ class MovieDetailsViewModel @Inject constructor( } private fun clearRatedState() = updateState { copy(isSuccessfullyRated = null) } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailScreen.kt b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailScreen.kt index a9d46533f..b4ec800d7 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailScreen.kt @@ -67,8 +67,8 @@ fun EpisodeDetailsScreen( onNavigateToActorDetails: (Int) -> Unit, viewModel: EpisodeDetailsViewModel = hiltViewModel() ) { - val uiState by viewModel.state.collectAsStateWithLifecycle() val effect by viewModel.effect.collectAsState(null) + val uiState by viewModel.state.collectAsStateWithLifecycle() effect?.Listen { currentEffect -> when (currentEffect) { @@ -103,7 +103,7 @@ private fun Content( val shouldShowBackground by remember { derivedStateOf { lazyListState.firstVisibleItemScrollOffset > 40f || - lazyListState.firstVisibleItemIndex > 0 + lazyListState.firstVisibleItemIndex > 0 } } @@ -207,7 +207,6 @@ private fun HeaderDetailsCard( modifier: Modifier = Modifier, uiState: EpisodeDetailsUiState ) { - Column( modifier = modifier.headerDetailsCard(), verticalArrangement = Arrangement.SpaceBetween @@ -268,7 +267,6 @@ private fun TvShowDate( } } - @Composable private fun GenreNames( modifier: Modifier = Modifier, @@ -330,4 +328,3 @@ private fun OverviewSection( } } } - diff --git a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsContract.kt b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsContract.kt index 23ddb2367..bc349c021 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsContract.kt @@ -5,4 +5,4 @@ interface EpisodeDetailsContract { fun onLoginClick() fun onRateEpisodeClick() fun onSelectRatingClick(rating: Int) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsEffect.kt b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsEffect.kt index dddde789b..c60c765f4 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsEffect.kt @@ -4,4 +4,4 @@ sealed interface EpisodeDetailsEffect { data object BackNavigation : EpisodeDetailsEffect data object LoginNavigation : EpisodeDetailsEffect data class CastNavigation(val episodeId: Int) : EpisodeDetailsEffect -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsUiState.kt b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsUiState.kt index 48d59154b..c19eb6ea7 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsUiState.kt @@ -10,13 +10,13 @@ data class EpisodeDetailsUiState( val error: ErrorState? = null, val videoProvider: String = "", val isGuestUser: Boolean = false, - val images: List? = listOf(), val episode: EpisodeDetails? = null, + val images: List? = listOf(), val isSuccessfullyRated: Boolean? = null, val episodeGenres: List = listOf(), val isRateBottomSheetVisible: Boolean = false, val isGuestUserBottomSheetVisible: Boolean = false, -){ +) { val episodeHaveTrailer: Boolean get() = videoProvider.isNotEmpty() } diff --git a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsViewModel.kt index 2c1b2af5c..d81ad1b4a 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailsViewModel.kt @@ -15,11 +15,11 @@ import javax.inject.Inject @HiltViewModel class EpisodeDetailsViewModel @Inject constructor( + savedStateHandle: SavedStateHandle, + private val ratingUseCase: ManageRatingUseCase, private val getTvShowUseCase: GetTvShowUseCase, private val getTvEpisodesUseCase: GetTvEpisodesUseCase, - private val ratingUseCase: ManageRatingUseCase, - private val authenticationUseCase: AuthenticationUseCase, - savedStateHandle: SavedStateHandle, + private val authenticationUseCase: AuthenticationUseCase ) : BaseViewModel(EpisodeDetailsUiState()), EpisodeDetailsContract { @@ -29,6 +29,10 @@ class EpisodeDetailsViewModel @Inject constructor( private val episodeNumber = args?.episodeNumber ?: 0 init { + getEpisodeDetails() + } + + private fun getEpisodeDetails(){ loadEpisodeDetails() loadEpisodeRating() loadVideoProvider() @@ -66,6 +70,7 @@ class EpisodeDetailsViewModel @Inject constructor( } private suspend fun loadEpisodeData(): EpisodeDetailsData { + val episode = getTvEpisodesUseCase.getEpisodeByTvShowId( tvShowId = tvShowId, seasonNumber = seasonNumber, @@ -202,4 +207,5 @@ class EpisodeDetailsViewModel @Inject constructor( private companion object { const val DEFAULT_RATING = 0 } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailScreen.kt b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailScreen.kt index d3d7d427a..85e266db0 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailScreen.kt @@ -89,8 +89,8 @@ fun TvShowsDetailsScreen( onNavigateToEpisodeDetails: (tvShowId: Int, episodeNumber: Int, seasonNumber: Int) -> Unit, viewModel: TvShowDetailsViewModel = hiltViewModel() ) { - val uiState by viewModel.state.collectAsStateWithLifecycle() val effect by viewModel.effect.collectAsState(null) + val uiState by viewModel.state.collectAsStateWithLifecycle() effect?.Listen { currentEffect -> when (currentEffect) { @@ -144,7 +144,7 @@ private fun Content( val shouldShowBackground by remember { derivedStateOf { lazyListState.firstVisibleItemScrollOffset > 40f || - lazyListState.firstVisibleItemIndex > 0 + lazyListState.firstVisibleItemIndex > 0 } } @@ -322,7 +322,7 @@ private fun Content( } @Composable -fun HeaderDetailsCard( +private fun HeaderDetailsCard( modifier: Modifier = Modifier, uiState: TvShowDetailsUiState, onReviewClick: (tvShowId: Int) -> Unit, @@ -332,7 +332,6 @@ fun HeaderDetailsCard( date: String, numberOfSeasons: Int ) { - Column( modifier = modifier, verticalArrangement = Arrangement.SpaceBetween @@ -370,7 +369,7 @@ fun HeaderDetailsCard( } @Composable -fun GenreNames( +private fun GenreNames( modifier: Modifier = Modifier, uiState: TvShowDetailsUiState, onGenreClick: (genreUi: TvShowGenreUi) -> Unit @@ -409,7 +408,7 @@ fun GenreNames( @Composable -fun TvShowBasicDetails( +private fun TvShowBasicDetails( modifier: Modifier = Modifier, rating: String, date: String, @@ -433,7 +432,7 @@ fun TvShowBasicDetails( } @Composable -fun ViewReviewText( +private fun ViewReviewText( onReviewClick: (tvShowId: Int) -> Unit, tvShowId: Int, ) { @@ -446,10 +445,9 @@ fun ViewReviewText( } @Composable -fun Seasons( +private fun Seasons( numberOfSeasons: Int ) { - Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp) @@ -479,10 +477,9 @@ fun Seasons( } @Composable -fun TvShowDate( +private fun TvShowDate( date: String ) { - if (date.isEmpty() || date.isBlank()) return Row( verticalAlignment = Alignment.CenterVertically, @@ -513,12 +510,11 @@ fun TvShowDate( } @Composable -fun CastSection( +private fun CastSection( modifier: Modifier = Modifier, castMembers: List, onNavigateToCast: (Int) -> Unit ) { - Column(modifier = modifier) { Text( text = stringResource(R.string.cast), @@ -546,7 +542,7 @@ fun CastSection( } @Composable -fun SeasonEpisodesDetails( +private fun SeasonEpisodesDetails( modifier: Modifier = Modifier, uiState: TvShowDetailsUiState, viewModel: TvShowDetailsViewModel = hiltViewModel() @@ -655,7 +651,7 @@ private fun EpisodeItem( } @Composable -fun EpisodeDuration( +private fun EpisodeDuration( durationTime: String? ) { Row( diff --git a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailsContract.kt b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailsContract.kt index 8d9ca30c5..fa1883044 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailsContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailsContract.kt @@ -12,4 +12,4 @@ interface TvShowDetailsContract { fun onGenreClicked(genre: TvShowGenreUi) fun onReviewsClicked(tvShowId: Int, mediaType: MediaType) fun onEpisodeClicked(tvShowId: Int, episodeNumber: Int, seasonNumber: Int) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailsEffect.kt b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailsEffect.kt index 3a8871d5b..3218c5b94 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailsEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailsEffect.kt @@ -6,8 +6,8 @@ import com.london.presentation.shared.genre.TvShowGenreUi sealed interface TvShowDetailsEffect { data class OnNavigateToEpisodeDetails( val tvShowId: Int, - val episodeNumber: Int, - val seasonNumber: Int + val seasonNumber: Int, + val episodeNumber: Int ) : TvShowDetailsEffect data object NavigateBack : TvShowDetailsEffect @@ -15,4 +15,4 @@ sealed interface TvShowDetailsEffect { data class NavigateToCast(val tvShowId: Int) : TvShowDetailsEffect data class NavigateToTvShowsByCategoryId(val category: TvShowGenreUi) : TvShowDetailsEffect data class NavigateToReviews(val tvShowId: Int, val mediaType: MediaType) : TvShowDetailsEffect -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/home/HomeScreen.kt b/presentation/src/main/java/com/london/presentation/feature/home/HomeScreen.kt index 28f46e0e7..314702c47 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/HomeScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/HomeScreen.kt @@ -501,8 +501,8 @@ private fun rememberScrollState( val itemsBeforeStickyHeader = if (recentWatchedMediaFlow.isNotEmpty()) 5 else 4 val scrollThreshold = 42 lazyGridState.firstVisibleItemIndex > itemsBeforeStickyHeader || - (lazyGridState.firstVisibleItemIndex == itemsBeforeStickyHeader && - lazyGridState.firstVisibleItemScrollOffset > scrollThreshold) + (lazyGridState.firstVisibleItemIndex == itemsBeforeStickyHeader && + lazyGridState.firstVisibleItemScrollOffset > scrollThreshold) } } diff --git a/presentation/src/main/java/com/london/presentation/feature/home/HomeScreenContract.kt b/presentation/src/main/java/com/london/presentation/feature/home/HomeScreenContract.kt index 83a33f3a4..386aa1c53 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/HomeScreenContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/HomeScreenContract.kt @@ -15,4 +15,4 @@ interface HomeScreenContract { fun onManageBookmarkClicked(movieId: Int) fun onMovieGenreSelect(genre: MovieGenreUi) fun loadUpcomingMoviesClick(genre: MovieGenreUi) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/home/HomeViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/home/HomeViewModel.kt index 554fa07cf..2a6f7d8e4 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/HomeViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/HomeViewModel.kt @@ -37,6 +37,10 @@ class HomeViewModel @Inject constructor( ) : BaseViewModel(HomeScreenUiState()), HomeScreenContract { init { + getHomeInfo() + } + + private fun getHomeInfo() { initializePopularMedia() initializeTopRatedMedia() handleRecentWatchedMedia() @@ -55,7 +59,7 @@ class HomeViewModel @Inject constructor( private fun createUpComingFlow(): Flow> { val upcomingMoviesFlow: Flow> = state.value.selectedCategoryFlow - .flatMapLatest { category -> createUpcomingPagingFlow(category?: MovieGenreUi.All) } + .flatMapLatest { category -> createUpcomingPagingFlow(category ?: MovieGenreUi.All) } .cachedIn(viewModelScope) return upcomingMoviesFlow @@ -197,4 +201,5 @@ class HomeViewModel @Inject constructor( override fun onTrendingActorsCardClick() = emitEffect(HomeScreenEffect.TrendingActorNavigation) -} \ No newline at end of file + +} diff --git a/presentation/src/main/java/com/london/presentation/feature/home/continuewatching/ContinueWatchingViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/home/continuewatching/ContinueWatchingViewModel.kt index 6a1869904..d3e639295 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/continuewatching/ContinueWatchingViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/continuewatching/ContinueWatchingViewModel.kt @@ -15,8 +15,8 @@ import javax.inject.Inject @HiltViewModel class ContinueWatchingViewModel @Inject constructor( - private val manageRecentTvShowWatchedUseCase: ManageRecentTvShowWatchedUseCase, private val manageRecentMovieWatchedUseCase: ManageRecentMovieWatchedUseCase, + private val manageRecentTvShowWatchedUseCase: ManageRecentTvShowWatchedUseCase ) : BaseViewModel(ContinueWatchingUiState()), ContinueWatchingContract { @@ -113,4 +113,5 @@ class ContinueWatchingViewModel @Inject constructor( updateState { copy(movies = movies, tvSeries = tvSeries) } private fun setLoadingState(isLoading: Boolean) = updateState { copy(isLoading = isLoading) } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/home/popular/PopularSection.kt b/presentation/src/main/java/com/london/presentation/feature/home/popular/PopularSection.kt index 3d1221adf..65c15cf19 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/popular/PopularSection.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/popular/PopularSection.kt @@ -83,7 +83,6 @@ private fun Content( val density = LocalDensity.current val layoutDirection = LocalLayoutDirection.current val isRtl = layoutDirection == LayoutDirection.Rtl - val screenWidth = with(density) { LocalConfiguration.current.screenWidthDp.dp } @@ -279,4 +278,4 @@ private fun Preview(modifier: Modifier = Modifier) { ), onManageBookmarkClicked = { }, ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/home/popular/PopularUiMedia.kt b/presentation/src/main/java/com/london/presentation/feature/home/popular/PopularUiMedia.kt index 83e927ee5..6f43b1a93 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/popular/PopularUiMedia.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/popular/PopularUiMedia.kt @@ -8,4 +8,4 @@ data class PopularUiMedia( val rating: String, val posterUrl: String, val mediaType: MediaType -) \ No newline at end of file +) diff --git a/presentation/src/main/java/com/london/presentation/feature/home/section/CarouselSection.kt b/presentation/src/main/java/com/london/presentation/feature/home/section/CarouselSection.kt index 89d125f7f..7c138c18a 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/section/CarouselSection.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/section/CarouselSection.kt @@ -28,9 +28,9 @@ import com.london.presentation.shared.HomeCard fun HomeCarouselSection( onAllClick: () -> Unit, onSaveClick: (Int) -> Unit, - onCardClick: (Int, MediaType) -> Unit, @StringRes sectionName: Int, uiMediaList: List, + onCardClick: (Int, MediaType) -> Unit, modifier: Modifier = Modifier, isLoading: Boolean = false, carouselState: CarouselState = rememberCarouselState { uiMediaList.size }, @@ -94,4 +94,4 @@ private object HomeCarouselDefaults { val ITEM_SPACING = 8.dp val CARD_CORNER_RADIUS = 12.dp val BORDER_WIDTH = 1.dp -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/home/section/ContinueWatchingSection.kt b/presentation/src/main/java/com/london/presentation/feature/home/section/ContinueWatchingSection.kt index 067885baf..4485e9f49 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/section/ContinueWatchingSection.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/section/ContinueWatchingSection.kt @@ -9,8 +9,8 @@ import com.london.presentation.feature.home.HomeUiMedia @Composable fun ContinueWatchingSection( - recentWatchedMediaList: List, homeScreenContract: HomeScreenContract, + recentWatchedMediaList: List, modifier: Modifier = Modifier ) { HomeCarouselSection( @@ -26,4 +26,4 @@ fun ContinueWatchingSection( }, onAllClick = homeScreenContract::onContinueWatchingClick ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/home/section/ShimmerPopularSection.kt b/presentation/src/main/java/com/london/presentation/feature/home/section/ShimmerPopularSection.kt index 23dd382ab..e7390e792 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/section/ShimmerPopularSection.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/section/ShimmerPopularSection.kt @@ -104,10 +104,12 @@ fun ShimmerPopularSection( .shimmerEffect(), ) { - repeat(3){ - Box(modifier = Modifier - .height(280.dp) - .width(190.dp)) + repeat(3) { + Box( + modifier = Modifier + .height(280.dp) + .width(190.dp) + ) } if (pagerState.currentPage == page) @@ -158,4 +160,4 @@ private object ShimmerPopularSection { const val ROTATION_FRACTION_MULTIPLIER = 0.5f const val SCALE_MIN_FRACTION = 0f const val SCALE_MAX_FRACTION = 1f -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/home/section/TopRatedSection.kt b/presentation/src/main/java/com/london/presentation/feature/home/section/TopRatedSection.kt index d79c5951e..ce4ecce44 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/section/TopRatedSection.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/section/TopRatedSection.kt @@ -27,4 +27,4 @@ fun TopRatedSection( }, onAllClick = homeScreenContract::onTopRatedClick ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedContract.kt b/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedContract.kt index 09f6a3240..b30695519 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedContract.kt @@ -14,5 +14,4 @@ interface TopRatedContract { fun onMediaCategoryTabSelected(selectedMediaCategory: MediaCategory) fun onBookmarkSheetDismiss() fun onManageBookmarkClicked(movieId: Int) - } diff --git a/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedEffect.kt b/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedEffect.kt index df304b971..65e90deeb 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedEffect.kt @@ -4,4 +4,4 @@ sealed interface TopRatedEffect { data object NavigateBack : TopRatedEffect data class NavigateToMovieDetails(val id: Int) : TopRatedEffect data class NavigateToTvShowDetails(val id: Int) : TopRatedEffect -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedScreen.kt b/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedScreen.kt index 57f41a7bf..34bf3a92b 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedScreen.kt @@ -42,10 +42,10 @@ import com.london.presentation.utils.gridColumns @Composable fun TopRatedScreen( - viewModel: TopRatedViewModel = hiltViewModel(), onNavigateBack: () -> Unit = {}, onNavigateToMovieDetails: (Int) -> Unit = {}, - onNavigateToTvShowDetails: (Int) -> Unit = {} + onNavigateToTvShowDetails: (Int) -> Unit = {}, + viewModel: TopRatedViewModel = hiltViewModel() ) { val state by viewModel.state.collectAsStateWithLifecycle() val effect by viewModel.effect.collectAsState(null) diff --git a/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedUiState.kt b/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedUiState.kt index 16964c808..1b32c1faf 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedUiState.kt @@ -13,8 +13,8 @@ data class TopRatedUiState( val errorMessage: String? = null, val isMovieSelected: Boolean = true, val selectedMovieGenre: MovieGenreUi = MovieGenreUi.All, - val selectedTvShowGenre: TvShowGenreUi = TvShowGenreUi.All, val movies: Flow> = emptyFlow(), + val selectedTvShowGenre: TvShowGenreUi = TvShowGenreUi.All, val tvSeries: Flow> = emptyFlow(), val selectedMediaCategory: MediaCategory = MediaCategory.Movies, val isBookmarkSheetVisible: Boolean = false, diff --git a/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedViewModel.kt index f79510212..665b595b9 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedViewModel.kt @@ -93,7 +93,6 @@ class TopRatedViewModel @Inject constructor( genre = state.value.selectedMovieGenre.toDomain() ) } - moviesFlow }, onStart = { updateState { copy(isLoading = true) } diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/TrendingCategories.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/TrendingCategories.kt index 47a5d7503..c18c5a1d9 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/TrendingCategories.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/TrendingCategories.kt @@ -41,8 +41,8 @@ import com.london.presentation.R @Composable fun TrendingSection( onMoviesClick: () -> Unit, - onTvShowsClick: () -> Unit, onActorsClick: () -> Unit, + onTvShowsClick: () -> Unit, modifier: Modifier = Modifier, isLoading: Boolean = false, ) { @@ -70,7 +70,7 @@ fun TrendingSection( .shimmerEffect() ) - Row ( + Row( modifier = Modifier .padding(bottom = 12.dp) .fillMaxWidth() @@ -79,38 +79,38 @@ fun TrendingSection( horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.Bottom ) { - CategoryCard( - title = stringResource(R.string.Movies), - icon = painterResource(id = R.drawable.icon_movie), - startColor = NovixTheme.colors.primary, - endColor = NovixTheme.colors.darkCocoa, - imageWidth = 60.dp, - imageHeight = 64.dp, - onClick = onMoviesClick, - modifier = Modifier.weight(1f) - ) + CategoryCard( + title = stringResource(R.string.Movies), + icon = painterResource(id = R.drawable.icon_movie), + startColor = NovixTheme.colors.primary, + endColor = NovixTheme.colors.darkCocoa, + imageWidth = 60.dp, + imageHeight = 64.dp, + onClick = onMoviesClick, + modifier = Modifier.weight(1f) + ) - CategoryCard( - title = stringResource(R.string.TV_Shows), - icon = painterResource(id = R.drawable.icon_tvshow), - startColor = NovixTheme.colors.secondary, - endColor = NovixTheme.colors.deepCrimson, - imageWidth = 88.46.dp, - imageHeight = 64.dp, - onClick = onTvShowsClick, - modifier = Modifier.weight(1f) - ) + CategoryCard( + title = stringResource(R.string.TV_Shows), + icon = painterResource(id = R.drawable.icon_tvshow), + startColor = NovixTheme.colors.secondary, + endColor = NovixTheme.colors.deepCrimson, + imageWidth = 88.46.dp, + imageHeight = 64.dp, + onClick = onTvShowsClick, + modifier = Modifier.weight(1f) + ) - CategoryCard( - title = stringResource(R.string.actors), - icon = painterResource(id = R.drawable.icon_actor), - startColor = NovixTheme.colors.tealBlue, - endColor = NovixTheme.colors.oceanDark, - imageWidth = 56.49.dp, - imageHeight = 64.dp, - onClick = onActorsClick, - modifier = Modifier.weight(1f) - ) + CategoryCard( + title = stringResource(R.string.actors), + icon = painterResource(id = R.drawable.icon_actor), + startColor = NovixTheme.colors.tealBlue, + endColor = NovixTheme.colors.oceanDark, + imageWidth = 56.49.dp, + imageHeight = 64.dp, + onClick = onActorsClick, + modifier = Modifier.weight(1f) + ) } } } @@ -175,4 +175,4 @@ private fun Preview() { onTvShowsClick = {}, onActorsClick = {} ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/actor/TrendingActorsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/actor/TrendingActorsScreen.kt index d02c17a98..b141d5d31 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/actor/TrendingActorsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/actor/TrendingActorsScreen.kt @@ -26,8 +26,8 @@ import com.london.presentation.utils.Listen @Composable fun TrendingActorsScreen( - onNavigateToActorDetailsClick: (Int) -> Unit, onNavigateBackClick: () -> Unit, + onNavigateToActorDetailsClick: (Int) -> Unit, viewModel: TrendingActorsViewModel = hiltViewModel() ) { val state by viewModel.state.collectAsStateWithLifecycle() @@ -106,4 +106,4 @@ private fun Preview() = NovixTheme { state = TrendingActorsUiState(), contract = defaultTrendingActorsContract() ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/actor/TrendingActorsViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/actor/TrendingActorsViewModel.kt index e17a36f84..b27342f1f 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/actor/TrendingActorsViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/actor/TrendingActorsViewModel.kt @@ -14,7 +14,7 @@ import javax.inject.Inject @HiltViewModel class TrendingActorsViewModel @Inject constructor( - private val getActorUseCase: GetActorUseCase, + private val getActorUseCase: GetActorUseCase ) : BaseViewModel(TrendingActorsUiState()), TrendingActorsContract { @@ -22,11 +22,11 @@ class TrendingActorsViewModel @Inject constructor( getTrendingActors() } - override fun onActorClick(id: Int) = emitEffect(TrendingActorsEffect.ActorDetailsNavigation(id)) + override fun onRetryClick() = getTrendingActors() override fun onBackClick() = emitEffect(TrendingActorsEffect.BackNavigation) - override fun onRetryClick() = getTrendingActors() + override fun onActorClick(id: Int) = emitEffect(TrendingActorsEffect.ActorDetailsNavigation(id)) private fun getTrendingActors() { tryToExecute( @@ -58,4 +58,5 @@ class TrendingActorsViewModel @Inject constructor( private fun setLoadingState(isLoading: Boolean) = updateState { copy(isLoading = isLoading) } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesScreen.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesScreen.kt index eb9b3b87d..5f1532204 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesScreen.kt @@ -28,8 +28,8 @@ import com.london.presentation.utils.Listen @Composable fun TrendingMoviesScreen( - onNavigateToMovieDetailsClick: (Int) -> Unit, onNavigateBackClick: () -> Unit, + onNavigateToMovieDetailsClick: (Int) -> Unit, viewModel: TrendingMoviesViewModel = hiltViewModel() ) { val state by viewModel.state.collectAsState() diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesUiState.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesUiState.kt index a78eadcbf..9dbfec44e 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesUiState.kt @@ -9,10 +9,10 @@ import kotlinx.coroutines.flow.emptyFlow data class TrendingMoviesUiState( val isSaved: Boolean = false, - val selectedGenre: MovieGenreUi = MovieGenreUi.All, val backdropPath: String = "", val isLoading: Boolean = false, val errorState: ErrorState? = null, + val selectedGenre: MovieGenreUi = MovieGenreUi.All, val moviesFlow: Flow> = emptyFlow(), val movieGenres: List = MovieGenreUi.getList(), val isBookmarkSheetVisible: Boolean = false, diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesViewModel.kt index b7364f55f..c00b13dc8 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesViewModel.kt @@ -16,7 +16,7 @@ import javax.inject.Inject @HiltViewModel class TrendingMoviesViewModel @Inject constructor( - private val getMovieUseCase: GetMovieUseCase, + private val getMovieUseCase: GetMovieUseCase ) : BaseViewModel(TrendingMoviesUiState()), TrendingMoviesContract { @@ -32,14 +32,14 @@ class TrendingMoviesViewModel @Inject constructor( getTrendingMovies() } + override fun onRetryClick() = getTrendingMovies() + override fun onBackClick() = emitEffect(TrendingMoviesEffect.BackNavigation) override fun onMovieClick(id: Int) = emitEffect(TrendingMoviesEffect.MovieDetailsNavigation(id)) - override fun onRetryClick() = getTrendingMovies() - override fun onManageBookmarkClicked(movieId: Int) { updateState { copy( @@ -88,4 +88,5 @@ class TrendingMoviesViewModel @Inject constructor( ) } ).cachedIn(viewModelScope) + } diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsContract.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsContract.kt index 3fa6488b5..d23072b19 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsContract.kt @@ -1,6 +1,5 @@ package com.london.presentation.feature.home.trending.tvshow -import com.london.domain.entity.genre.TvShowGenre import com.london.presentation.shared.genre.TvShowGenreUi interface TrendingTvShowsContract { diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsScreen.kt index 526cf8bab..32eab1b9e 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsScreen.kt @@ -28,8 +28,8 @@ import com.london.presentation.utils.Listen @Composable fun TrendingTvShowsScreen( - onNavigateToTvShowDetailsClick: (Int) -> Unit, onNavigateBack: () -> Unit, + onNavigateToTvShowDetailsClick: (Int) -> Unit, viewModel: TrendingTvShowsViewModel = hiltViewModel() ) { val state by viewModel.state.collectAsStateWithLifecycle() @@ -59,7 +59,6 @@ fun TrendingTvShowsScreen( } } - @Composable private fun Content( state: TrendingTvShowsUiState, diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsUiState.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsUiState.kt index c7b0f9180..48a7d7e87 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsUiState.kt @@ -8,8 +8,8 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.emptyFlow data class TrendingTvShowsUiState( - val selectedGenreId: Int? = null, val isLoading: Boolean = false, + val selectedGenreId: Int? = null, val errorState: ErrorState? = null, val tvShowsFlow: Flow> = emptyFlow(), val tvShowsGenres: List = TvShowGenreUi.getList(), diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsViewModel.kt index 08a949694..8d91f5702 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsViewModel.kt @@ -17,7 +17,7 @@ import javax.inject.Inject @HiltViewModel class TrendingTvShowsViewModel @Inject constructor( - private val getTvShowUseCase: GetTvShowUseCase, + private val getTvShowUseCase: GetTvShowUseCase ) : BaseViewModel(TrendingTvShowsUiState()), TrendingTvShowsContract { @@ -69,4 +69,5 @@ class TrendingTvShowsViewModel @Inject constructor( } ).cachedIn(viewModelScope) } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/home/upcoming/upcomingSection.kt b/presentation/src/main/java/com/london/presentation/feature/home/upcoming/UpcomingSection.kt similarity index 99% rename from presentation/src/main/java/com/london/presentation/feature/home/upcoming/upcomingSection.kt rename to presentation/src/main/java/com/london/presentation/feature/home/upcoming/UpcomingSection.kt index f2066c636..34c444605 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/upcoming/upcomingSection.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/upcoming/UpcomingSection.kt @@ -111,4 +111,4 @@ private fun ShimmerMovieCard() { .clip(RoundedCornerShape(12.dp)) .shimmerEffect() ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/addListBottomSheet.kt b/presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/AddListBottomSheet.kt similarity index 93% rename from presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/addListBottomSheet.kt rename to presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/AddListBottomSheet.kt index f16d74b6b..41028f11c 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/addListBottomSheet.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/AddListBottomSheet.kt @@ -1,5 +1,6 @@ package com.london.presentation.feature.list.bottomsheets +import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource @@ -30,6 +31,8 @@ import com.london.designsystem.component.Text import com.london.designsystem.component.button.PrimaryButton import com.london.designsystem.component.rememberModalBottomSheetState import com.london.designsystem.theme.NovixTheme +import com.london.designsystem.utils.painter +import com.london.designsystem.utils.string import com.london.presentation.R import com.london.presentation.feature.list.savedlist.AddSheetState import com.london.presentation.feature.list.savedlist.ListContract @@ -38,9 +41,9 @@ import kotlinx.coroutines.launch @Composable fun AddListBottomSheet( - modifier: Modifier = Modifier, addListSheetState: AddSheetState, addListInteractions: ListContract, + modifier: Modifier = Modifier, sheetState: SheetState = rememberModalBottomSheetState(), ) { val coroutineScope = rememberCoroutineScope() @@ -119,13 +122,14 @@ private fun Content( color = NovixTheme.colors.stroke, shape = RoundedCornerShape(8.dp) ) + .background(color = NovixTheme.colors.iconBackgroundLow) .clickable( enabled = !addSheetState.isSheetLoading, onClick = onCloseClicked ) - .padding(6.dp), - painter = painterResource(com.london.designsystem.R.drawable.cancel), - contentDescription = "Close", + .padding(8.dp), + painter = com.london.designsystem.R.drawable.cancel.painter, + contentDescription = R.string.cancel_addition_to_list.string, tint = NovixTheme.colors.title ) } @@ -164,7 +168,7 @@ private fun isButtonEnabled(addSheetState: AddSheetState): Boolean { @Composable @Preview -fun Preview() { +private fun Preview() { Content( addSheetState = AddSheetState( listName = TextFieldValue(""), @@ -173,4 +177,4 @@ fun Preview() { onCloseClicked = {}, addInteractions = defaultContractList() ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/DeleteListBottomSheet.kt b/presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/DeleteListBottomSheet.kt index 83097c26d..51a503291 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/DeleteListBottomSheet.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/DeleteListBottomSheet.kt @@ -97,14 +97,15 @@ private fun Content( Box( modifier = modifier - .background(color = NovixTheme.colors.iconBackgroundLow) .clip(RoundedCornerShape(8.dp)) .border( width = 1.dp, color = NovixTheme.colors.stroke, shape = RoundedCornerShape(8.dp) ) - .clickable(onClick = hideSheet), + .background(color = NovixTheme.colors.iconBackgroundLow) + .clickable(onClick = hideSheet) + , contentAlignment = Alignment.Center ) { Icon( @@ -150,4 +151,4 @@ private fun Content( } ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/listContract.kt b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListContract.kt similarity index 81% rename from presentation/src/main/java/com/london/presentation/feature/list/savedlist/listContract.kt rename to presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListContract.kt index 7021002d3..f314595b7 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/listContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListContract.kt @@ -3,7 +3,6 @@ package com.london.presentation.feature.list.savedlist import androidx.compose.ui.text.input.TextFieldValue interface ListContract { - fun onRetry() fun onFabClick() fun onLoginClick() @@ -11,11 +10,11 @@ interface ListContract { fun onAddList(listName: String) fun setAddListSheetVisible(visible: Boolean) fun onListNameChanged(listName: TextFieldValue) + fun resetSnackBarErrorState() + fun resetSnackBarSuccessState() } - fun defaultContractList() = object : ListContract { - override fun onRetry() {} override fun onFabClick() {} override fun onLoginClick() {} @@ -23,4 +22,6 @@ fun defaultContractList() = object : ListContract { override fun onAddList(listName: String) {} override fun setAddListSheetVisible(visible: Boolean) {} override fun onListNameChanged(listName: TextFieldValue) {} -} \ No newline at end of file + override fun resetSnackBarErrorState() {} + override fun resetSnackBarSuccessState() {} +} diff --git a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/listScreen.kt b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListScreen.kt similarity index 92% rename from presentation/src/main/java/com/london/presentation/feature/list/savedlist/listScreen.kt rename to presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListScreen.kt index b7e52f9ec..e10323eaf 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/listScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListScreen.kt @@ -16,7 +16,9 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -39,13 +41,15 @@ import com.london.designsystem.component.Text import com.london.designsystem.component.TopBar import com.london.designsystem.component.button.FloatingActionButton import com.london.designsystem.component.button.OutlineButton +import com.london.designsystem.snackbar.LocalSnackbarController +import com.london.designsystem.snackbar.SnackBarType import com.london.designsystem.theme.NovixTheme import com.london.designsystem.theme.ThemePreviews import com.london.designsystem.utils.painter +import com.london.designsystem.utils.string import com.london.domain.entity.movie.MovieList import com.london.presentation.R import com.london.presentation.feature.list.bottomsheets.AddListBottomSheet -import com.london.presentation.shared.SnackBarAnimation import com.london.presentation.shared.base.ErrorState import com.london.presentation.shared.buildscreen.BuildScreen import com.london.presentation.utils.Listen @@ -54,11 +58,10 @@ import com.london.presentation.utils.toLocalizedNumbers @Composable fun ListScreen( - onNavigateToListDetails: (Int) -> Unit, onNavigateToLogin: () -> Unit, + onNavigateToListDetails: (Int) -> Unit, viewModel: ListViewModel = hiltViewModel() ) { - val state by viewModel.state.collectAsStateWithLifecycle() val effect by viewModel.effect.collectAsState(null) @@ -117,16 +120,23 @@ private fun Content( ) } - if (state.isSnackBarSuccessVisible) { - SnackBarAnimation( - message = stringResource(R.string.list_added_success), - icon = com.london.designsystem.R.drawable.ic_success + val snackBarController = LocalSnackbarController.current + + if (state.error != null) { + snackBarController.showMessage( + message = R.string.list_added_fail.string, + snackBarType = SnackBarType.Error, + onComplete = contract::resetSnackBarErrorState, + icon = null, ) } - if (state.error != null) { - SnackBarAnimation( - message = stringResource(R.string.list_added_fail) + if (state.isSnackBarSuccessVisible) { + snackBarController.showMessage( + message = R.string.list_added_success.string, + snackBarType = SnackBarType.Success, + onComplete = contract::resetSnackBarSuccessState, + icon = com.london.designsystem.R.drawable.ic_success, ) } } @@ -238,7 +248,9 @@ private fun EmptyList( showFab = true, ) { Box( - modifier = Modifier.fillMaxSize() + modifier = Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) ) { EmptyLayout( modifier = Modifier diff --git a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/listUiState.kt b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListUiState.kt similarity index 100% rename from presentation/src/main/java/com/london/presentation/feature/list/savedlist/listUiState.kt rename to presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListUiState.kt diff --git a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListViewModel.kt index a0d36d92b..69e1137eb 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListViewModel.kt @@ -17,10 +17,10 @@ import kotlinx.coroutines.flow.Flow @HiltViewModel class ListViewModel @Inject constructor( + savedStateHandle: SavedStateHandle, private val manageGetMovieUseCase: ManageGetMovieUseCase, - private val manageMovieListUseCase: ManageMovieListUseCase, private val authenticationUseCase: AuthenticationUseCase, - savedStateHandle: SavedStateHandle, + private val manageMovieListUseCase: ManageMovieListUseCase ) : BaseViewModel(ListUiState()), ListContract { private val args = savedStateHandle.getArgs() @@ -33,26 +33,29 @@ class ListViewModel @Inject constructor( setAddListSheetVisible(args?.createList ?: false) } - override fun onRetry() = fetchSavedLists() + override fun onRetry() = + fetchSavedLists() override fun onFabClick() = setAddListSheetVisible(true) override fun onLoginClick() = emitEffect(ListEffect.NavigateToLogin) - - override fun onListClick(id: Int) { - updateState { copy(isSnackBarSuccessVisible = false) } - emitEffect(ListEffect.NavigateToDetails(id)) - } + override fun onListClick(id: Int) = emitEffect(ListEffect.NavigateToDetails(id)) override fun setAddListSheetVisible(visible: Boolean) = updateState { copy(addListSheetState = addListSheetState.copy(isSheetVisible = visible)) } - override fun onListNameChanged(listName: TextFieldValue) = updateState { copy(addListSheetState = addListSheetState.copy(listName = listName)) } + override fun resetSnackBarErrorState() { + updateState { copy(isSnackBarSuccessVisible = false) } + } + + override fun resetSnackBarSuccessState() { + updateState { copy(error = null) } + } override fun onAddList(listName: String) { tryToExecute( @@ -82,7 +85,7 @@ class ListViewModel @Inject constructor( block = { createListsPagingSource() }, onStart = { updateState { copy(isLoading = true) } }, onSuccess = { moviesFlow -> updateState { copy(items = moviesFlow) } }, - onError = { errorState -> updateState { copy(error = errorState,) } }, + onError = { errorState -> updateState { copy(error = errorState) } }, onCompleted = { updateState { copy(isLoading = false) } }, ) } diff --git a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/viewItemsContract.kt b/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsContract.kt similarity index 70% rename from presentation/src/main/java/com/london/presentation/feature/list/viewitems/viewItemsContract.kt rename to presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsContract.kt index ce1d9298e..45b65befd 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/viewItemsContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsContract.kt @@ -8,4 +8,7 @@ interface ViewListItemsContract { fun onMovieClick(id: Int) fun onRemoveMovieClick(id: Int) fun onDeleteBottomSheetDismiss() -} \ No newline at end of file + fun resetSnackBarErrorState() + fun resetMovieSnackBarSuccessState() + fun resetListSnackBarSuccessState() +} diff --git a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/viewItemsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsScreen.kt similarity index 75% rename from presentation/src/main/java/com/london/presentation/feature/list/viewitems/viewItemsScreen.kt rename to presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsScreen.kt index 0a5bc4c15..39d2adab1 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/viewItemsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsScreen.kt @@ -6,19 +6,19 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.paging.compose.collectAsLazyPagingItems import com.london.designsystem.component.TopBar +import com.london.designsystem.snackbar.LocalSnackbarController +import com.london.designsystem.snackbar.SnackBarType import com.london.designsystem.theme.NovixTheme import com.london.designsystem.theme.ThemePreviews +import com.london.designsystem.utils.string import com.london.presentation.R import com.london.presentation.feature.list.bottomsheets.DeleteListBottomSheet import com.london.presentation.shared.MediaLazyPagingGrid -import com.london.presentation.shared.SnackBarAnimation import com.london.presentation.shared.base.ErrorState import com.london.presentation.shared.buildscreen.BuildScreen import com.london.presentation.utils.Listen @@ -29,7 +29,6 @@ fun ViewListItemsScreen( onNavigateToMovieDetails: (Int) -> Unit, viewModel: ViewItemsViewModel = hiltViewModel() ) { - val state by viewModel.state.collectAsStateWithLifecycle() val effect by viewModel.effect.collectAsState(null) @@ -84,6 +83,7 @@ private fun Content( contract.onRetry() }, isItemSaved = { true }, + hasSaveIcon = true ) } } @@ -93,22 +93,38 @@ private fun Content( contract = contract, ) + val snackBarController = LocalSnackbarController.current + if (state.isSnackBarErrorVisible) { - SnackBarAnimation( - stringResource(R.string.deletion_failed), + snackBarController.showMessage( + message = R.string.deletion_failed.string, + snackBarType = SnackBarType.Error, + onComplete = contract::resetSnackBarErrorState, + icon = null, + ) + } + + if (state.isMovieSnackBarSuccessVisible) { + snackBarController.showMessage( + message = R.string.movie_removed_successfully.string, + snackBarType = SnackBarType.Success, + onComplete = contract::resetMovieSnackBarSuccessState, + icon = com.london.designsystem.R.drawable.ic_success, ) } - if (state.isSnackBarSuccessVisible) { - SnackBarAnimation( - stringResource(R.string.movie_removed_successfully), - icon = com.london.designsystem.R.drawable.ic_success + if (state.isListSnackBarSuccess) { + snackBarController.showMessage( + message = R.string.list_removed_successfully.string, + snackBarType = SnackBarType.Success, + onComplete = contract::resetListSnackBarSuccessState, + icon = com.london.designsystem.R.drawable.ic_success, ) } + } @Composable -@Preview @ThemePreviews private fun Preview() { NovixTheme { @@ -122,6 +138,9 @@ private fun Preview() { override fun onMovieClick(id: Int) {} override fun onRemoveMovieClick(id: Int) {} override fun onDeleteBottomSheetDismiss() {} + override fun resetSnackBarErrorState() {} + override fun resetMovieSnackBarSuccessState() {} + override fun resetListSnackBarSuccessState() {} }, ) } diff --git a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsUiState.kt b/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsUiState.kt index 17d41f914..612379494 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsUiState.kt @@ -9,9 +9,10 @@ import kotlinx.coroutines.flow.flow data class ViewItemsUiState( val listTitle: String = "", val error: ErrorState? = null, - val isSnackBarSuccessVisible: Boolean = false, - val isSnackBarErrorVisible: Boolean = false, val isLoading: Boolean = false, + val isSnackBarErrorVisible: Boolean = false, + val isMovieSnackBarSuccessVisible: Boolean = false, + val isListSnackBarSuccess: Boolean = false, val isDeleteBottomSheetVisible: Boolean = false, val listItems: Flow> = flow {}, -) \ No newline at end of file +) diff --git a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsViewModel.kt index 8981f5be9..79e5012f1 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsViewModel.kt @@ -16,10 +16,10 @@ import javax.inject.Inject @HiltViewModel class ViewItemsViewModel @Inject constructor( + savedStateHandle: SavedStateHandle, private val manageGetMovieUseCase: ManageGetMovieUseCase, - private val getMovieListNameUseCase: GetMovieListNameUseCase, private val manageMovieListUseCase: ManageMovieListUseCase, - savedStateHandle: SavedStateHandle + private val getMovieListNameUseCase: GetMovieListNameUseCase ) : BaseViewModel(ViewItemsUiState()), ViewListItemsContract { @@ -27,49 +27,51 @@ class ViewItemsViewModel @Inject constructor( private val listId = args?.listId ?: 0 init { + getMovieItemsInfo() + } + + private fun getMovieItemsInfo() { getMovieListName(listId = listId) fetchMovieListDetails(listId = listId) } override fun onBack() { - emitEffect(ViewItemsEffect.NavigateBack) } override fun onRetry() { - updateState { copy(error = null) } fetchMovieListDetails(listId) } override fun onDeleteClick() { - updateState { copy(isDeleteBottomSheetVisible = true) } } override fun onConfirmDelete() { - tryToExecute( - onStart = { onClearStateOnStart() }, + onStart = { resetSnackBarsState() }, block = { manageMovieListUseCase.deleteMovieList(listId) }, onCompleted = { updateState { copy(isDeleteBottomSheetVisible = false) } }, onError = { updateState { copy(isSnackBarErrorVisible = true, error = it) } }, - onSuccess = { emitEffect(ViewItemsEffect.NavigateBack) } + onSuccess = { + emitEffect(ViewItemsEffect.NavigateBack) + updateState { copy(isListSnackBarSuccess = true) } + } ) } override fun onMovieClick(id: Int) { - onClearStateOnStart() + resetSnackBarsState() emitEffect(ViewItemsEffect.NavigationMovieDetails(id)) } override fun onRemoveMovieClick(id: Int) { - tryToExecute( block = { manageMovieListUseCase.removeMovieFromList(listId = listId, movieId = id) }, - onStart = { onClearStateOnStart() }, + onStart = { resetSnackBarsState() }, onError = { updateState { copy(isSnackBarErrorVisible = true, error = it) } }, - onSuccess = { updateState { copy(isSnackBarSuccessVisible = true) } } + onSuccess = { updateState { copy(isMovieSnackBarSuccessVisible = true) } } ) } @@ -77,16 +79,25 @@ class ViewItemsViewModel @Inject constructor( updateState { copy(isDeleteBottomSheetVisible = false) } } - private fun onClearStateOnStart() { + private fun resetSnackBarsState() { updateState { copy( - error = null, isSnackBarSuccessVisible = false, isSnackBarErrorVisible = false + error = null, + isMovieSnackBarSuccessVisible = false, + isSnackBarErrorVisible = false, + isListSnackBarSuccess = false ) } } - private fun fetchMovieListDetails(listId: Int) { + override fun resetMovieSnackBarSuccessState() = + updateState { copy(isMovieSnackBarSuccessVisible = false) } + + override fun resetSnackBarErrorState() = updateState { copy(isSnackBarErrorVisible = false) } + override fun resetListSnackBarSuccessState() = updateState { copy(isListSnackBarSuccess = false) } + + private fun fetchMovieListDetails(listId: Int) { tryToExecute( block = { createMoviesPagingSource(listId = listId) }, onStart = { updateState { copy(isLoading = true) } }, @@ -106,7 +117,6 @@ class ViewItemsViewModel @Inject constructor( } private fun getMovieListName(listId: Int) { - tryToExecute( block = { getMovieListNameUseCase.invoke(listId) }, onStart = { updateState { copy(isLoading = true) } }, diff --git a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewContract.kt b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewContract.kt index 70017eb7a..e512ce419 100644 --- a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewContract.kt @@ -3,4 +3,4 @@ package com.london.presentation.feature.reviews interface ReviewContract { fun onRetry() fun onBackClicked() -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewEffect.kt b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewEffect.kt index aa0f06e67..5d1a0bc7c 100644 --- a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewEffect.kt @@ -2,4 +2,4 @@ package com.london.presentation.feature.reviews sealed interface ReviewEffect { data object NavigateBack : ReviewEffect -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsDimens.kt b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsDimens.kt index 3e3c054da..e978f6c55 100644 --- a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsDimens.kt +++ b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsDimens.kt @@ -14,4 +14,4 @@ internal object ReviewsDimens { val AuthorInfoStartPadding = 8.dp val ContentTopPadding = 12.dp val EmptyStateImageSize = 128.dp -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsScreen.kt index 318501d4a..eebc8295b 100644 --- a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsScreen.kt @@ -350,4 +350,4 @@ private fun ReviewsDate( color = NovixTheme.colors.body ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsUiState.kt b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsUiState.kt index a4079f543..6d945a9bf 100644 --- a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsUiState.kt @@ -7,7 +7,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow data class ReviewsUiState( - val isLoading: Boolean = false, val error: ErrorState? = null, + val isLoading: Boolean = false, val reviews: Flow> = flow {}, -) \ No newline at end of file +) diff --git a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsViewModel.kt index ab5134f48..deec6cbf6 100644 --- a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsViewModel.kt @@ -17,9 +17,9 @@ import javax.inject.Inject @HiltViewModel class ReviewsViewModel @Inject constructor( + savedStateHandle: SavedStateHandle, private val getMovieUseCase: GetMovieUseCase, - private val getTvShowUseCase: GetTvShowUseCase, - savedStateHandle: SavedStateHandle + private val getTvShowUseCase: GetTvShowUseCase ) : BaseViewModel(ReviewsUiState()), ReviewContract { private val args = savedStateHandle.getArgs() @@ -80,4 +80,5 @@ class ReviewsViewModel @Inject constructor( MediaType.Movie -> getMovieUseCase.getMovieReviews(mediaId, pageNumber) MediaType.TvShow -> getTvShowUseCase.getTvShowReviews(mediaId, pageNumber) } -} \ No newline at end of file + +} diff --git a/presentation/src/main/java/com/london/presentation/feature/search/SearchCategory.kt b/presentation/src/main/java/com/london/presentation/feature/search/SearchCategory.kt index c0465102b..288d8e9f7 100644 --- a/presentation/src/main/java/com/london/presentation/feature/search/SearchCategory.kt +++ b/presentation/src/main/java/com/london/presentation/feature/search/SearchCategory.kt @@ -6,5 +6,5 @@ import com.london.presentation.R enum class SearchCategory(@StringRes val title: Int) { Movies(R.string.Movies), TvShows(R.string.TV_Shows), - Actors(R.string.Actors) -} \ No newline at end of file + Actors(R.string.Actors), +} diff --git a/presentation/src/main/java/com/london/presentation/feature/search/SearchContract.kt b/presentation/src/main/java/com/london/presentation/feature/search/SearchContract.kt index a5b30eff7..856c84152 100644 --- a/presentation/src/main/java/com/london/presentation/feature/search/SearchContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/search/SearchContract.kt @@ -29,4 +29,3 @@ interface SearchContract { fun onBookmarkSheetDismiss() fun onManageBookmarkClicked(movieId: Int) } - diff --git a/presentation/src/main/java/com/london/presentation/feature/search/SearchEffect.kt b/presentation/src/main/java/com/london/presentation/feature/search/SearchEffect.kt index 122573308..93c7e8585 100644 --- a/presentation/src/main/java/com/london/presentation/feature/search/SearchEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/search/SearchEffect.kt @@ -1,7 +1,7 @@ package com.london.presentation.feature.search sealed interface SearchEffect { - data class MovieDetailsNavigation(val movieId: Int) : SearchEffect data class TvShowDetailsNavigation(val tvId: Int) : SearchEffect + data class MovieDetailsNavigation(val movieId: Int) : SearchEffect data class ActorDetailsNavigation(val actorId: Int) : SearchEffect } diff --git a/presentation/src/main/java/com/london/presentation/feature/search/SearchScreen.kt b/presentation/src/main/java/com/london/presentation/feature/search/SearchScreen.kt index 7afc998af..a4360aa68 100644 --- a/presentation/src/main/java/com/london/presentation/feature/search/SearchScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/search/SearchScreen.kt @@ -74,8 +74,8 @@ import com.london.presentation.utils.toRecentViewed @Composable fun SearchScreen( onNavigateToActorDetails: (Int) -> Unit, - onNavigateToTvShowDetails: (Int) -> Unit, onNavigateToMovieDetails: (Int) -> Unit, + onNavigateToTvShowDetails: (Int) -> Unit, viewModel: SearchViewModel = hiltViewModel() ) { val state by viewModel.state.collectAsStateWithLifecycle() @@ -493,7 +493,7 @@ private fun RecentSection( } @Composable -fun RecentSectionContent( +private fun RecentSectionContent( state: SearchUiState, contract: SearchContract, onNavigateToTvShowDetails: (Int) -> Unit, diff --git a/presentation/src/main/java/com/london/presentation/feature/search/SearchViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/search/SearchViewModel.kt index 3b09f2ea5..c6d971ba1 100644 --- a/presentation/src/main/java/com/london/presentation/feature/search/SearchViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/search/SearchViewModel.kt @@ -27,6 +27,10 @@ class SearchViewModel @Inject constructor( private val _searchQuery = MutableStateFlow("") init { + getSearchInfo() + } + + private fun getSearchInfo() { updateRecentData() setupSearchDebouncing() } @@ -354,4 +358,5 @@ class SearchViewModel @Inject constructor( category = state.value.selectedCategory ) } + } diff --git a/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/onboardingRoute.kt b/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/OnboardingRoute.kt similarity index 100% rename from presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/onboardingRoute.kt rename to presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/OnboardingRoute.kt diff --git a/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/onboardingScreen.kt b/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/OnboardingScreen.kt similarity index 97% rename from presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/onboardingScreen.kt rename to presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/OnboardingScreen.kt index ad9ddaabd..e51ce9779 100644 --- a/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/onboardingScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/OnboardingScreen.kt @@ -111,7 +111,6 @@ private fun HandleEffects( } } - @Composable private fun Content( pagerState: PagerState, @@ -134,7 +133,7 @@ private fun Content( .verticalScroll(rememberScrollState()) ) { Spacer(Modifier.weight(1f)) - OnboardingPageContent(uiState.pages[page]) + PageContent(uiState.pages[page]) Spacer(Modifier.weight(1f)) } } @@ -178,7 +177,7 @@ private fun BottomNavigation( dotsStates = List(pagesCount) { index -> index == currentPage } ) - OnboardingNavigationButtons( + NavigationButtons( isFirstPage = isFirstPage, onPrevious = onPrevious, onNext = onNext @@ -205,7 +204,7 @@ private fun SkipButton( } @Composable -fun OnboardingPageContent(page: OnboardingPage) { +private fun PageContent(page: OnboardingPage) { Column( modifier = Modifier .fillMaxSize() @@ -264,7 +263,7 @@ fun OnboardingPageContent(page: OnboardingPage) { } @Composable -fun OnboardingNavigationButtons( +private fun NavigationButtons( isFirstPage: Boolean, modifier: Modifier = Modifier, onPrevious: () -> Unit, @@ -304,10 +303,9 @@ fun OnboardingNavigationButtons( } } - @ThemePreviews @Composable -fun OnboardingPreview() { +private fun Preview() { OnboardingScreen( onComplete = {}, ) diff --git a/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/onboardingUiState.kt b/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/OnboardingUiState.kt similarity index 99% rename from presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/onboardingUiState.kt rename to presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/OnboardingUiState.kt index 1926b13c5..428cdd8a8 100644 --- a/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/onboardingUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/OnboardingUiState.kt @@ -11,7 +11,6 @@ data class OnboardingUiState( val isLastPage = currentPage == pages.lastIndex } - data class OnboardingPage( @StringRes val title: Int, @StringRes val description: Int, diff --git a/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/OnboardingViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/OnboardingViewModel.kt index c9b9ebc35..e4df1a1cf 100644 --- a/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/OnboardingViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/OnboardingViewModel.kt @@ -18,7 +18,6 @@ class OnboardingViewModel @Inject constructor( private val appPreferencesService: AppPreferencesService ) : BaseViewModel(OnboardingUiState()) { - fun onPageChanged(page: Int) { updateState { copy(currentPage = page) } } diff --git a/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/welcomeScreen.kt b/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/WelcomeScreen.kt similarity index 97% rename from presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/welcomeScreen.kt rename to presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/WelcomeScreen.kt index 159f3c6f3..a98eeec5d 100644 --- a/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/welcomeScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/welcome/onboarding/WelcomeScreen.kt @@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBars -import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState @@ -130,7 +129,7 @@ private fun Content( } @Composable -fun WelcomePoster(modifier: Modifier = Modifier) { +private fun WelcomePoster(modifier: Modifier = Modifier) { Box( modifier = modifier, contentAlignment = Alignment.BottomCenter @@ -168,10 +167,9 @@ fun WelcomePoster(modifier: Modifier = Modifier) { } } - @ThemePreviews @Composable -fun PreviewWelcomeScreen() { +private fun PreviewWelcomeScreen() { WelcomeScreen( onNavigateContinue = {}, onNavigateLogin = {} diff --git a/presentation/src/main/java/com/london/presentation/feature/welcome/splash/SplashEffect.kt b/presentation/src/main/java/com/london/presentation/feature/welcome/splash/SplashEffect.kt index e5c942011..2b3552415 100644 --- a/presentation/src/main/java/com/london/presentation/feature/welcome/splash/SplashEffect.kt +++ b/presentation/src/main/java/com/london/presentation/feature/welcome/splash/SplashEffect.kt @@ -4,4 +4,4 @@ sealed class SplashEffect { data object Home : SplashEffect() data object Welcome : SplashEffect() data object Onboarding : SplashEffect() -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/feature/welcome/splash/SplashRoute.kt b/presentation/src/main/java/com/london/presentation/feature/welcome/splash/SplashRoute.kt index 594bb4fb4..a13c14b57 100644 --- a/presentation/src/main/java/com/london/presentation/feature/welcome/splash/SplashRoute.kt +++ b/presentation/src/main/java/com/london/presentation/feature/welcome/splash/SplashRoute.kt @@ -4,9 +4,9 @@ import androidx.compose.runtime.Composable @Composable fun SplashRoute( - onNavigateToOnboarding: () -> Unit, - onNavigateToWelcome: () -> Unit, onNavigateToHome: () -> Unit, + onNavigateToWelcome: () -> Unit, + onNavigateToOnboarding: () -> Unit, ) { SplashScreen( onNavigateToOnboarding = onNavigateToOnboarding, diff --git a/presentation/src/main/java/com/london/presentation/feature/welcome/splash/SplashScreen.kt b/presentation/src/main/java/com/london/presentation/feature/welcome/splash/SplashScreen.kt index 91c49c5c5..555e783c1 100644 --- a/presentation/src/main/java/com/london/presentation/feature/welcome/splash/SplashScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/welcome/splash/SplashScreen.kt @@ -20,16 +20,16 @@ import com.london.presentation.utils.Listen @Composable fun SplashScreen( - onNavigateToOnboarding: () -> Unit = {}, - onNavigateToWelcome: () -> Unit = {}, onNavigateToHome: () -> Unit = {}, + onNavigateToWelcome: () -> Unit = {}, + onNavigateToOnboarding: () -> Unit = {}, viewModel: SplashViewModel = hiltViewModel() ) { val effect by viewModel.effect.collectAsState(null) effect?.Listen { currentEffect -> - when(currentEffect){ + when (currentEffect) { SplashEffect.Home -> onNavigateToHome() SplashEffect.Onboarding -> onNavigateToOnboarding() SplashEffect.Welcome -> onNavigateToWelcome() @@ -52,6 +52,6 @@ fun SplashScreen( @ThemePreviews @Composable -fun PreviewSplashScreen() { +private fun PreviewSplashScreen() { SplashScreen() -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/localization/LocaleUtils.kt b/presentation/src/main/java/com/london/presentation/localization/LocaleUtils.kt index bb4fb6f7d..1073ffb8a 100644 --- a/presentation/src/main/java/com/london/presentation/localization/LocaleUtils.kt +++ b/presentation/src/main/java/com/london/presentation/localization/LocaleUtils.kt @@ -10,4 +10,4 @@ fun Context.wrapWithLocale(locale: Locale): Context { newConfig.setLocale(locale) newConfig.setLayoutDirection(locale) return createConfigurationContext(newConfig) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/localization/LocalizationManager.kt b/presentation/src/main/java/com/london/presentation/localization/LocalizationManager.kt index 34afcc2b8..185b4f137 100644 --- a/presentation/src/main/java/com/london/presentation/localization/LocalizationManager.kt +++ b/presentation/src/main/java/com/london/presentation/localization/LocalizationManager.kt @@ -18,8 +18,4 @@ class LocalizationManager @Inject constructor( val localeFlow: Flow = appPreferencesService.appLanguage .map { Locale.forLanguageTag(it.code) } - - fun setLocale(locale: Locale) { - appPreferencesService.setAppLanguageCode(locale.toLanguageTag()) - } } diff --git a/presentation/src/main/java/com/london/presentation/navigation/LocalNavController.kt b/presentation/src/main/java/com/london/presentation/navigation/LocalNavController.kt index 6aed8eb4c..33a7412f2 100644 --- a/presentation/src/main/java/com/london/presentation/navigation/LocalNavController.kt +++ b/presentation/src/main/java/com/london/presentation/navigation/LocalNavController.kt @@ -6,6 +6,3 @@ import androidx.navigation.NavHostController val LocalNavController = staticCompositionLocalOf { error("Nav controller is not provided") } - - - diff --git a/presentation/src/main/java/com/london/presentation/navigation/Screen.kt b/presentation/src/main/java/com/london/presentation/navigation/Screen.kt index 4315e1ef7..81bbdecf4 100644 --- a/presentation/src/main/java/com/london/presentation/navigation/Screen.kt +++ b/presentation/src/main/java/com/london/presentation/navigation/Screen.kt @@ -7,6 +7,7 @@ import kotlinx.serialization.Serializable @Serializable sealed interface Screen { + @Serializable data object Splash : Screen @@ -97,4 +98,5 @@ sealed interface Screen { @Serializable data object MyRating : Screen + } diff --git a/presentation/src/main/java/com/london/presentation/navigation/getArgs.kt b/presentation/src/main/java/com/london/presentation/navigation/getArgs.kt index cc2b1aca5..29603a97a 100644 --- a/presentation/src/main/java/com/london/presentation/navigation/getArgs.kt +++ b/presentation/src/main/java/com/london/presentation/navigation/getArgs.kt @@ -5,7 +5,6 @@ import androidx.navigation.NavType import androidx.navigation.toRoute import kotlin.reflect.KType - inline fun SavedStateHandle.getArgs( typeMap: Map> = emptyMap() -): T? = runCatching { toRoute(typeMap = typeMap) }.getOrNull() \ No newline at end of file +): T? = runCatching { toRoute(typeMap = typeMap) }.getOrNull() diff --git a/presentation/src/main/java/com/london/presentation/shared/ActorItem.kt b/presentation/src/main/java/com/london/presentation/shared/ActorItem.kt index 2c212a86b..b46833805 100644 --- a/presentation/src/main/java/com/london/presentation/shared/ActorItem.kt +++ b/presentation/src/main/java/com/london/presentation/shared/ActorItem.kt @@ -49,7 +49,7 @@ fun ActorItem( TextSection( actorName = actorName, characterName = characterName, - onClick= onClick, + onClick = onClick, modifier = Modifier.weight(1f) ) } @@ -189,4 +189,4 @@ private fun ActorItemPreview() { onClick = {} ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/ActorsLayout.kt b/presentation/src/main/java/com/london/presentation/shared/ActorsLayout.kt index bb9001086..faca3197f 100644 --- a/presentation/src/main/java/com/london/presentation/shared/ActorsLayout.kt +++ b/presentation/src/main/java/com/london/presentation/shared/ActorsLayout.kt @@ -8,8 +8,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.paging.compose.LazyPagingItems -import com.london.designsystem.theme.NovixTheme -import com.london.designsystem.theme.ThemePreviews import com.london.domain.entity.actor.Actor @Composable @@ -36,10 +34,3 @@ fun ActorsLayout( } } } - -@ThemePreviews -@Composable -fun ActorsLayoutPreviews() { - NovixTheme { - } -} \ No newline at end of file diff --git a/presentation/src/main/java/com/london/presentation/shared/CarousalShimmer.kt b/presentation/src/main/java/com/london/presentation/shared/CarousalShimmer.kt index 453eb508d..68f65fa53 100644 --- a/presentation/src/main/java/com/london/presentation/shared/CarousalShimmer.kt +++ b/presentation/src/main/java/com/london/presentation/shared/CarousalShimmer.kt @@ -34,26 +34,29 @@ fun CarousalShimmerEffect( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp) ) { - Box(modifier = Modifier - .height(210.dp) - .clip(RoundedCornerShape(12.dp)) - .weight(1f) - .shimmerEffect() + Box( + modifier = Modifier + .height(210.dp) + .clip(RoundedCornerShape(12.dp)) + .weight(1f) + .shimmerEffect() ) - Box(modifier = Modifier - .height(210.dp) - .clip(RoundedCornerShape(12.dp)) - .weight(0.5f) - .shimmerEffect() + Box( + modifier = Modifier + .height(210.dp) + .clip(RoundedCornerShape(12.dp)) + .weight(0.5f) + .shimmerEffect() ) - Box(modifier = Modifier - .height(210.dp) - .clip(RoundedCornerShape(12.dp)) - .weight(0.5f) - .shimmerEffect() + Box( + modifier = Modifier + .height(210.dp) + .clip(RoundedCornerShape(12.dp)) + .weight(0.5f) + .shimmerEffect() ) } } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/CategoryItem.kt b/presentation/src/main/java/com/london/presentation/shared/CategoryItem.kt index 150ea51e3..c99a6a3f1 100644 --- a/presentation/src/main/java/com/london/presentation/shared/CategoryItem.kt +++ b/presentation/src/main/java/com/london/presentation/shared/CategoryItem.kt @@ -30,12 +30,11 @@ import com.london.designsystem.theme.ThemePreviews import com.london.designsystem.theme.noRippleClickable import com.london.domain.entity.contentrestriction.ContentRestrictionLevel - @Composable fun CategoriesItem( - categoryName: String, categoryImage: Any?, onClick: () -> Unit, + categoryName: String, modifier: Modifier = Modifier ) { Box( @@ -86,7 +85,7 @@ fun CategoriesItem( } @Composable -fun CategoryGrid( +private fun CategoryGrid( categories: List, onCategoryItemClick: (CategoryItem) -> Unit, modifier: Modifier = Modifier @@ -109,7 +108,7 @@ fun CategoryGrid( @ThemePreviews @Composable -fun CategoryGridPreview() { +private fun CategoryGridPreview() { val categories = listOf( CategoryItem( @@ -120,8 +119,8 @@ fun CategoryGridPreview() { categoryName = "Drama", categoryImage = "" ), + ) - ) NovixTheme { Column( modifier = Modifier @@ -142,4 +141,4 @@ fun CategoryGridPreview() { data class CategoryItem( val categoryName: String, val categoryImage: String, -) \ No newline at end of file +) diff --git a/presentation/src/main/java/com/london/presentation/shared/ConditionalText.kt b/presentation/src/main/java/com/london/presentation/shared/ConditionalText.kt index 26de81538..93f290906 100644 --- a/presentation/src/main/java/com/london/presentation/shared/ConditionalText.kt +++ b/presentation/src/main/java/com/london/presentation/shared/ConditionalText.kt @@ -24,8 +24,8 @@ fun ConditionalText( minimumLineLength: Int = 4, onExpandedChange: () -> Unit ) { - var showReadMoreButtonState by remember { mutableStateOf(false) } var truncatedText by remember { mutableStateOf("") } + var showReadMoreButtonState by remember { mutableStateOf(false) } val textStyle = NovixTheme.typography.body.small.copy(color = NovixTheme.colors.body) val actionStyle = SpanStyle( diff --git a/presentation/src/main/java/com/london/presentation/shared/ContentRestrictionLocal.kt b/presentation/src/main/java/com/london/presentation/shared/ContentRestrictionLocal.kt index 42395caef..053189415 100644 --- a/presentation/src/main/java/com/london/presentation/shared/ContentRestrictionLocal.kt +++ b/presentation/src/main/java/com/london/presentation/shared/ContentRestrictionLocal.kt @@ -3,4 +3,4 @@ package com.london.presentation.shared import androidx.compose.runtime.compositionLocalOf import com.london.domain.entity.contentrestriction.ContentRestrictionLevel -val LocalContentRestrictionLevel = compositionLocalOf { ContentRestrictionLevel.MODERATE } \ No newline at end of file +val LocalContentRestrictionLevel = compositionLocalOf { ContentRestrictionLevel.MODERATE } diff --git a/presentation/src/main/java/com/london/presentation/shared/CustomBackDropImagePager.kt b/presentation/src/main/java/com/london/presentation/shared/CustomBackDropImagePager.kt index f8581c887..e670aa9c1 100644 --- a/presentation/src/main/java/com/london/presentation/shared/CustomBackDropImagePager.kt +++ b/presentation/src/main/java/com/london/presentation/shared/CustomBackDropImagePager.kt @@ -30,8 +30,8 @@ import kotlinx.coroutines.isActive @Composable fun CustomBackDropImagePager( - modifier: Modifier = Modifier, images: List, + modifier: Modifier = Modifier, isVisibleDots: Boolean = true ) { val validImages = images.filter { it.isNotBlank() } @@ -137,4 +137,4 @@ private fun ImageVerticalGradient() { ) ) ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/DefaultAppTopBar.kt b/presentation/src/main/java/com/london/presentation/shared/DefaultAppTopBar.kt index 905b7e983..d522e7bd5 100644 --- a/presentation/src/main/java/com/london/presentation/shared/DefaultAppTopBar.kt +++ b/presentation/src/main/java/com/london/presentation/shared/DefaultAppTopBar.kt @@ -19,4 +19,4 @@ fun DefaultAppTopBar( title = title, onBackClick = onBack ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/EmptyGenreLayout.kt b/presentation/src/main/java/com/london/presentation/shared/EmptyGenreLayout.kt index 54df79407..c0ff9bf5e 100644 --- a/presentation/src/main/java/com/london/presentation/shared/EmptyGenreLayout.kt +++ b/presentation/src/main/java/com/london/presentation/shared/EmptyGenreLayout.kt @@ -41,11 +41,12 @@ fun EmptyGenreLayout( style = NovixTheme.typography.body.small, color = NovixTheme.colors.body ) + } } @Preview @Composable -fun EmptyStateViewPreview() { +private fun EmptyStateViewPreview() { EmptyGenreLayout() -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/GenresSection.kt b/presentation/src/main/java/com/london/presentation/shared/GenresSection.kt index b949b7a87..1c89cd59f 100644 --- a/presentation/src/main/java/com/london/presentation/shared/GenresSection.kt +++ b/presentation/src/main/java/com/london/presentation/shared/GenresSection.kt @@ -43,12 +43,14 @@ fun GenresSection( onClick = { onGenreClick(genre) } ) else - Box(modifier = Modifier.height(40.dp) - .width(60.dp) - .padding(bottom = 8.dp) - .clip(RoundedCornerShape(12)) - .shimmerEffect() + Box( + modifier = Modifier + .height(40.dp) + .width(60.dp) + .padding(bottom = 8.dp) + .clip(RoundedCornerShape(12)) + .shimmerEffect() ) } } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/HomeCard.kt b/presentation/src/main/java/com/london/presentation/shared/HomeCard.kt index f7f4728ff..4cb01c211 100644 --- a/presentation/src/main/java/com/london/presentation/shared/HomeCard.kt +++ b/presentation/src/main/java/com/london/presentation/shared/HomeCard.kt @@ -26,13 +26,12 @@ fun HomeCard( imageUrl: Any, modifier: Modifier = Modifier, rate: String? = null, + onSaveClick: () -> Unit, isSaved: Boolean = false, hasSaveIcon: Boolean = true, onDeleteClick: () -> Unit = {}, imageDescription: String? = null, - onSaveClick: () -> Unit, ) { - Box( modifier = Modifier .clip(RoundedCornerShape(12.dp)) @@ -86,7 +85,7 @@ fun HomeCard( @ThemePreviews @Composable -fun HomeCardPreview() { +private fun HomeCardPreview() { NovixTheme { HomeCard( imageUrl = "https://image.tmdb.org/t/p/w500/rktDFPbfHfUbArZ6OOOKsXcv0Bm.jpg", @@ -94,4 +93,4 @@ fun HomeCardPreview() { onSaveClick = {}, ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/ImageView.kt b/presentation/src/main/java/com/london/presentation/shared/ImageView.kt index a9b6880c0..946523c1b 100644 --- a/presentation/src/main/java/com/london/presentation/shared/ImageView.kt +++ b/presentation/src/main/java/com/london/presentation/shared/ImageView.kt @@ -54,4 +54,4 @@ fun ImageView( errorContent = errorContent, moderatedContent = moderatedContent ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/LazyPagingColumn.kt b/presentation/src/main/java/com/london/presentation/shared/LazyPagingColumn.kt index 574a48538..6f1bc9793 100644 --- a/presentation/src/main/java/com/london/presentation/shared/LazyPagingColumn.kt +++ b/presentation/src/main/java/com/london/presentation/shared/LazyPagingColumn.kt @@ -15,10 +15,10 @@ fun LazyPagingColumn( itemContent: @Composable (T) -> Unit, ) { Content( - modifier = modifier, - items = pagingItems, - itemContent = itemContent - ) + modifier = modifier, + items = pagingItems, + itemContent = itemContent + ) } @Composable diff --git a/presentation/src/main/java/com/london/presentation/shared/MediaGenreFilters.kt b/presentation/src/main/java/com/london/presentation/shared/MediaGenreFilters.kt index ed627c9d3..6e5fb76a9 100644 --- a/presentation/src/main/java/com/london/presentation/shared/MediaGenreFilters.kt +++ b/presentation/src/main/java/com/london/presentation/shared/MediaGenreFilters.kt @@ -86,4 +86,4 @@ private fun Preview() { onMovieGenreClick = {}, onTvShowGenreClick = {} ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/MediaLazyGrid.kt b/presentation/src/main/java/com/london/presentation/shared/MediaLazyGrid.kt index fbc274ea8..06bcd7783 100644 --- a/presentation/src/main/java/com/london/presentation/shared/MediaLazyGrid.kt +++ b/presentation/src/main/java/com/london/presentation/shared/MediaLazyGrid.kt @@ -27,33 +27,33 @@ import com.london.presentation.utils.gridColumns message = "Use MediaLazyVerticalGrid or MediaLazyGridWithFilter instead. This composable will be removed in a future version. Note: Both have two overloads - one for List and one for LazyPagingItems.", replaceWith = ReplaceWith( expression = "MediaLazyGridWithFilter(" + - "items = items, " + - "modifier = modifier, " + - "imageUrl = getImageUrl, " + - "name = { it.getName() }, " + - "onSaveClick = onSavedClick, " + - "isItemSaved = isItemSaved, " + - "onDeleteClick = onDeleteClick, " + - "onMovieGenreClick = {}, " + - "onTvShowGenreClick = {}, " + - "config = MediaGridConfig(" + - " showSaveIcon = hasSaveIcon, " + - " isDarkMode = isDarkMode, " + - " myRatingList = myRatingList, " + - " rate = rate, " + - " isMovieSelected = true, " + - " isTvShowSelected = false, " + - " selectedMovieGenre = MovieGenre.All, " + - " selectedTvShowGenre = TvShowGenre.All, " + - " onNavigateToMovie = onItemClick, " + - "), " + - "topBar = {" + - " DefaultAppTopBar(" + - " title = title," + - " onBack = onBack" + - " )" + - "}" + - ")", + "items = items, " + + "modifier = modifier, " + + "imageUrl = getImageUrl, " + + "name = { it.getName() }, " + + "onSaveClick = onSavedClick, " + + "isItemSaved = isItemSaved, " + + "onDeleteClick = onDeleteClick, " + + "onMovieGenreClick = {}, " + + "onTvShowGenreClick = {}, " + + "config = MediaGridConfig(" + + " showSaveIcon = hasSaveIcon, " + + " isDarkMode = isDarkMode, " + + " myRatingList = myRatingList, " + + " rate = rate, " + + " isMovieSelected = true, " + + " isTvShowSelected = false, " + + " selectedMovieGenre = MovieGenre.All, " + + " selectedTvShowGenre = TvShowGenre.All, " + + " onNavigateToMovie = onItemClick, " + + "), " + + "topBar = {" + + " DefaultAppTopBar(" + + " title = title," + + " onBack = onBack" + + " )" + + "}" + + ")", imports = ["com.london.presentation.shared.container.MediaLazyGridWithFilter", "com.london.presentation.shared.container.MediaGridConfig", "com.london.presentation.utils.MovieGenre", "com.london.presentation.utils.TvShowGenre"] ), level = DeprecationLevel.WARNING @@ -135,4 +135,3 @@ fun MediaLazyGrid( } } } - diff --git a/presentation/src/main/java/com/london/presentation/shared/MediaLazyPagingGrid.kt b/presentation/src/main/java/com/london/presentation/shared/MediaLazyPagingGrid.kt index 99e05a8f9..0934df697 100644 --- a/presentation/src/main/java/com/london/presentation/shared/MediaLazyPagingGrid.kt +++ b/presentation/src/main/java/com/london/presentation/shared/MediaLazyPagingGrid.kt @@ -17,33 +17,33 @@ import com.london.presentation.utils.gridColumns message = "Use MediaLazyVerticalGrid or MediaLazyGridWithFilter instead. This composable will be removed in a future version. Note: Both have two overloads - one for List and one for LazyPagingItems.", replaceWith = ReplaceWith( expression = "MediaLazyGridWithFilter(" + - "items = items, " + - "modifier = modifier, " + - "imageUrl = getImageUrl, " + - "name = { it.getName() }, " + - "onSaveClick = onSavedClick, " + - "isItemSaved = isItemSaved, " + - "onDeleteClick = onDeleteClick, " + - "onMovieGenreClick = {}, " + - "onTvShowGenreClick = {}, " + - "config = MediaGridConfig(" + - " showSaveIcon = hasSaveIcon, " + - " isDarkMode = isDarkMode, " + - " myRatingList = myRatingList, " + - " rate = rate, " + - " isMovieSelected = true, " + - " isTvShowSelected = false, " + - " selectedMovieGenre = MovieGenre.All, " + - " selectedTvShowGenre = TvShowGenre.All, " + - " onNavigateToMovie = onItemClick, " + - "), " + - "topBar = {" + - " DefaultAppTopBar(" + - " title = title," + - " onBack = onBack" + - " )" + - "}" + - ")", + "items = items, " + + "modifier = modifier, " + + "imageUrl = getImageUrl, " + + "name = { it.getName() }, " + + "onSaveClick = onSavedClick, " + + "isItemSaved = isItemSaved, " + + "onDeleteClick = onDeleteClick, " + + "onMovieGenreClick = {}, " + + "onTvShowGenreClick = {}, " + + "config = MediaGridConfig(" + + " showSaveIcon = hasSaveIcon, " + + " isDarkMode = isDarkMode, " + + " myRatingList = myRatingList, " + + " rate = rate, " + + " isMovieSelected = true, " + + " isTvShowSelected = false, " + + " selectedMovieGenre = MovieGenre.All, " + + " selectedTvShowGenre = TvShowGenre.All, " + + " onNavigateToMovie = onItemClick, " + + "), " + + "topBar = {" + + " DefaultAppTopBar(" + + " title = title," + + " onBack = onBack" + + " )" + + "}" + + ")", imports = ["com.london.presentation.shared.container.MediaLazyGridWithFilter", "com.london.presentation.shared.container.MediaGridConfig", "com.london.presentation.utils.MovieGenre", "com.london.presentation.utils.TvShowGenre"] ), level = DeprecationLevel.WARNING diff --git a/presentation/src/main/java/com/london/presentation/shared/MoviesLayout.kt b/presentation/src/main/java/com/london/presentation/shared/MoviesLayout.kt index 7f5c14359..e4c031b6e 100644 --- a/presentation/src/main/java/com/london/presentation/shared/MoviesLayout.kt +++ b/presentation/src/main/java/com/london/presentation/shared/MoviesLayout.kt @@ -17,32 +17,32 @@ import com.london.presentation.utils.gridColumns message = "Use MediaLazyVerticalGrid or MediaLazyGridWithFilter instead. This composable will be removed in a future version. Note: Both have two overloads - one for List and one for LazyPagingItems.", replaceWith = ReplaceWith( expression = "MediaLazyGridWithFilter(" + - "items = items, " + - "modifier = modifier, " + - "imageUrl = getImageUrl, " + - "name = { it.getName() }, " + - "onSaveClick = onSavedClick, " + - "isItemSaved = isItemSaved, " + - "onDeleteClick = onDeleteClick, " + - "onMovieGenreClick = {}, " + - "onTvShowGenreClick = {}, " + - "config = MediaGridConfig(" + - " showSaveIcon = hasSaveIcon, " + - " isDarkMode = isDarkMode, " + - " myRatingList = myRatingList, " + - " rate = rate, " + - " isMovieSelected = true, " + - " isTvShowSelected = false, " + - " selectedMovieGenre = MovieGenre.All, " + - " onNavigateToMovie = onItemClick, " + - "), " + - "topBar = {" + - " DefaultAppTopBar(" + - " title = title," + - " onBack = onBack" + - " )" + - "}" + - ")", + "items = items, " + + "modifier = modifier, " + + "imageUrl = getImageUrl, " + + "name = { it.getName() }, " + + "onSaveClick = onSavedClick, " + + "isItemSaved = isItemSaved, " + + "onDeleteClick = onDeleteClick, " + + "onMovieGenreClick = {}, " + + "onTvShowGenreClick = {}, " + + "config = MediaGridConfig(" + + " showSaveIcon = hasSaveIcon, " + + " isDarkMode = isDarkMode, " + + " myRatingList = myRatingList, " + + " rate = rate, " + + " isMovieSelected = true, " + + " isTvShowSelected = false, " + + " selectedMovieGenre = MovieGenre.All, " + + " onNavigateToMovie = onItemClick, " + + "), " + + "topBar = {" + + " DefaultAppTopBar(" + + " title = title," + + " onBack = onBack" + + " )" + + "}" + + ")", imports = ["com.london.presentation.shared.container.MediaLazyGridWithFilter", "com.london.presentation.shared.container.MediaGridConfig", "com.london.presentation.utils.MovieGenre", "com.london.presentation.utils.TvShowGenre"] ), level = DeprecationLevel.WARNING @@ -76,4 +76,4 @@ fun MoviesLayOut( } } } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/RatingItem.kt b/presentation/src/main/java/com/london/presentation/shared/RatingItem.kt index 155e30471..cb055266d 100644 --- a/presentation/src/main/java/com/london/presentation/shared/RatingItem.kt +++ b/presentation/src/main/java/com/london/presentation/shared/RatingItem.kt @@ -36,4 +36,4 @@ fun RatingItem( color = color ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/SnackBarAnimation.kt b/presentation/src/main/java/com/london/presentation/shared/SnackBarAnimation.kt index fd41d24ef..5b895b50e 100644 --- a/presentation/src/main/java/com/london/presentation/shared/SnackBarAnimation.kt +++ b/presentation/src/main/java/com/london/presentation/shared/SnackBarAnimation.kt @@ -49,4 +49,4 @@ fun SnackBarAnimation(message: String?, icon: Int? = null) { icon = painterResource(icon ?: R.drawable.ic_failed) ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/TextWithIcon.kt b/presentation/src/main/java/com/london/presentation/shared/TextWithIcon.kt index c7072e9de..62c625880 100644 --- a/presentation/src/main/java/com/london/presentation/shared/TextWithIcon.kt +++ b/presentation/src/main/java/com/london/presentation/shared/TextWithIcon.kt @@ -45,7 +45,7 @@ fun TextWithIcon( .background(NovixTheme.colors.body) .align(alignment = Alignment.CenterVertically) ) - + Icon( painter = icon, contentDescription = stringResource(R.string.image_dot), diff --git a/presentation/src/main/java/com/london/presentation/shared/TriangleBlurredShape.kt b/presentation/src/main/java/com/london/presentation/shared/TriangleBlurredShape.kt index 59b94a0e1..e5a7a08d8 100644 --- a/presentation/src/main/java/com/london/presentation/shared/TriangleBlurredShape.kt +++ b/presentation/src/main/java/com/london/presentation/shared/TriangleBlurredShape.kt @@ -32,4 +32,4 @@ fun TriangleBlurredShape() { drawContent() } ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/TvShowsLayout.kt b/presentation/src/main/java/com/london/presentation/shared/TvShowsLayout.kt index 6300dd3ee..15282abfa 100644 --- a/presentation/src/main/java/com/london/presentation/shared/TvShowsLayout.kt +++ b/presentation/src/main/java/com/london/presentation/shared/TvShowsLayout.kt @@ -18,32 +18,32 @@ import com.london.presentation.utils.gridColumns message = "Use MediaLazyVerticalGrid or MediaLazyGridWithFilter instead. This composable will be removed in a future version. Note: Both have two overloads - one for List and one for LazyPagingItems.", replaceWith = ReplaceWith( expression = "MediaLazyGridWithFilter(" + - "items = items, " + - "modifier = modifier, " + - "imageUrl = getImageUrl, " + - "name = { it.getName() }, " + - "onSaveClick = onSavedClick, " + - "isItemSaved = isItemSaved, " + - "onDeleteClick = onDeleteClick, " + - "onMovieGenreClick = {}, " + - "onTvShowGenreClick = {}, " + - "config = MediaGridConfig(" + - " showSaveIcon = hasSaveIcon, " + - " isDarkMode = isDarkMode, " + - " myRatingList = myRatingList, " + - " rate = rate, " + - " isMovieSelected = true, " + - " isTvShowSelected = false, " + - " selectedTvShowGenre = TvShowGenre.All, " + - " onNavigateToMovie = onItemClick, " + - "), " + - "topBar = {" + - " DefaultAppTopBar(" + - " title = title," + - " onBack = onBack" + - " )" + - "}" + - ")", + "items = items, " + + "modifier = modifier, " + + "imageUrl = getImageUrl, " + + "name = { it.getName() }, " + + "onSaveClick = onSavedClick, " + + "isItemSaved = isItemSaved, " + + "onDeleteClick = onDeleteClick, " + + "onMovieGenreClick = {}, " + + "onTvShowGenreClick = {}, " + + "config = MediaGridConfig(" + + " showSaveIcon = hasSaveIcon, " + + " isDarkMode = isDarkMode, " + + " myRatingList = myRatingList, " + + " rate = rate, " + + " isMovieSelected = true, " + + " isTvShowSelected = false, " + + " selectedTvShowGenre = TvShowGenre.All, " + + " onNavigateToMovie = onItemClick, " + + "), " + + "topBar = {" + + " DefaultAppTopBar(" + + " title = title," + + " onBack = onBack" + + " )" + + "}" + + ")", imports = ["com.london.presentation.shared.container.MediaLazyGridWithFilter", "com.london.presentation.shared.container.MediaGridConfig", "com.london.presentation.utils.MovieGenre", "com.london.presentation.utils.TvShowGenre"] ), level = DeprecationLevel.WARNING @@ -78,4 +78,4 @@ fun TvShowLayOut( } } } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/base/BasePagingSource.kt b/presentation/src/main/java/com/london/presentation/shared/base/BasePagingSource.kt index 44f284292..704f85fb1 100644 --- a/presentation/src/main/java/com/london/presentation/shared/base/BasePagingSource.kt +++ b/presentation/src/main/java/com/london/presentation/shared/base/BasePagingSource.kt @@ -23,11 +23,12 @@ abstract class BasePagingSource : PagingSource() { val fetchResponse = onFetchPage(pageNumber = page) val isFirstPage = fetchResponse.currentPage == 1 val isLastPage = fetchResponse.totalPages == page + val isEmptyPage = fetchResponse.items.isEmpty() LoadResult.Page( data = fetchResponse.items, prevKey = if (isFirstPage) null else page.minus(1), - nextKey = if (isLastPage) null else page.plus(1), + nextKey = if (isLastPage || isEmptyPage) null else page.plus(1), ) } catch (e: Exception) { LoadResult.Error(e) @@ -36,16 +37,6 @@ abstract class BasePagingSource : PagingSource() { abstract suspend fun onFetchPage(pageNumber: Int): PagedFetchResponse - fun asFlow( - config: PagingConfig = PagingConfig( - pageSize = PAGING_PAGE_SIZE, - enablePlaceholders = true, - ), - ): Flow> = Pager( - config = config, - pagingSourceFactory = { this } - ).flow - companion object { const val PAGING_PAGE_SIZE = 20 } diff --git a/presentation/src/main/java/com/london/presentation/shared/base/BaseViewModel.kt b/presentation/src/main/java/com/london/presentation/shared/base/BaseViewModel.kt index 32a6dc868..6ce31ff70 100644 --- a/presentation/src/main/java/com/london/presentation/shared/base/BaseViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/shared/base/BaseViewModel.kt @@ -51,7 +51,6 @@ abstract class BaseViewModel(initState: S) : ViewModel() { onSuccess(response) return@onSuccess } - onError(ErrorState.RequestFailed().also { Timber.e(it.toString()) }) } .onFailure { @@ -129,4 +128,4 @@ abstract class BaseViewModel(initState: S) : ViewModel() { Timber.e(errorState.toString()) }.let { onError(it) } } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheet.kt b/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheet.kt index 9c32642c3..e0335dab9 100644 --- a/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheet.kt +++ b/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheet.kt @@ -2,6 +2,7 @@ package com.london.presentation.shared.bookmarkSheet import androidx.compose.animation.animateContentSize import androidx.compose.foundation.Image +import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -161,21 +162,21 @@ private fun BookmarkBottomSheetContent( val snackBarController = LocalSnackbarController.current - if (state.isSuccessSnackbarVisible) { + if (state.isSuccessSnackBarVisible) { snackBarController.showMessage( message = R.string.item_added_success.string, icon = com.london.designsystem.R.drawable.ic_success, snackBarType = SnackBarType.Success, - onComplete = contract::onSnackbarShown + onComplete = contract::onSnackBarShown ) } - if (state.isErrorSnackbarVisible) { + if (state.isErrorSnackBarVisible) { snackBarController.showMessage( message = R.string.item_added_fail.string, icon = com.london.designsystem.R.drawable.ic_failed, snackBarType = SnackBarType.Error, - onComplete = contract::onSnackbarShown + onComplete = contract::onSnackBarShown ) } } @@ -205,6 +206,7 @@ private fun SheetHeader( color = NovixTheme.colors.stroke, shape = RoundedCornerShape(8.dp) ) + .background(color = NovixTheme.colors.iconBackgroundLow) .clickable(onClick = hideSheet) .padding(8.dp), painter = com.london.designsystem.R.drawable.cancel.painter, @@ -274,7 +276,7 @@ private fun UserListsView( } @Composable -fun UserActions( +private fun UserActions( contract: BookmarkSheetContract, uiState: BookmarkSheetUiState, bookmarkedMovieId: Int diff --git a/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetContract.kt b/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetContract.kt index b9b1dd7c2..608615216 100644 --- a/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetContract.kt +++ b/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetContract.kt @@ -1,11 +1,11 @@ package com.london.presentation.shared.bookmarkSheet interface BookmarkSheetContract { + fun onDismiss() + fun onLoginClick() + fun onSnackBarShown() + fun onCreateNewList() fun onSheetShown(movieId: Int) fun onListSelected(listId: Int) - fun onCreateNewList() fun onAddToLists(bookmarkedId: Int) - fun onDismiss() - fun onSnackbarShown() - fun onLoginClick() -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetEffect.kt b/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetEffect.kt index 60ca65593..2d9097977 100644 --- a/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetEffect.kt +++ b/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetEffect.kt @@ -3,4 +3,4 @@ package com.london.presentation.shared.bookmarkSheet sealed interface BookmarkSheetEffect { object NewListCreation : BookmarkSheetEffect object LoginNavigation : BookmarkSheetEffect -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetUiState.kt b/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetUiState.kt index 1737068fe..13f946c3a 100644 --- a/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetUiState.kt +++ b/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetUiState.kt @@ -3,15 +3,15 @@ package com.london.presentation.shared.bookmarkSheet import com.london.presentation.shared.base.ErrorState data class BookmarkSheetUiState( - val lists: List = emptyList(), - val selectedLists: List = emptyList(), val error: ErrorState? = null, val isLoading: Boolean = false, + val shouldDismiss: Boolean = false, val isAddingToList: Boolean = false, val isGuestSession: Boolean = false, - val isErrorSnackbarVisible: Boolean = false, - val isSuccessSnackbarVisible: Boolean = false, - val shouldDismiss: Boolean = false + val selectedLists: List = emptyList(), + val isErrorSnackBarVisible: Boolean = false, + val lists: List = emptyList(), + val isSuccessSnackBarVisible: Boolean = false, ) data class BookmarkUiList( diff --git a/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetViewModel.kt b/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetViewModel.kt index d181a166c..f2be5db0e 100644 --- a/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/BookmarkSheetViewModel.kt @@ -9,9 +9,9 @@ import javax.inject.Inject @HiltViewModel class BookmarkSheetViewModel @Inject constructor( + private val authenticationUseCase: AuthenticationUseCase, private val manageMovieListUseCase: ManageMovieListUseCase, - private val getAvailableListsForMovie: GetAvailableListsForMovie, - private val authenticationUseCase: AuthenticationUseCase + private val getAvailableListsForMovie: GetAvailableListsForMovie ) : BaseViewModel(BookmarkSheetUiState()), BookmarkSheetContract { @@ -25,8 +25,8 @@ class BookmarkSheetViewModel @Inject constructor( updateState { copy( selectedLists = emptyList(), - isErrorSnackbarVisible = false, - isSuccessSnackbarVisible = false, + isErrorSnackBarVisible = false, + isSuccessSnackBarVisible = false, shouldDismiss = false, error = null, lists = emptyList() @@ -54,7 +54,7 @@ class BookmarkSheetViewModel @Inject constructor( onSuccess = { updateState { copy( - isSuccessSnackbarVisible = true, + isSuccessSnackBarVisible = true, shouldDismiss = true ) } @@ -63,7 +63,7 @@ class BookmarkSheetViewModel @Inject constructor( updateState { copy( error = error, - isErrorSnackbarVisible = true + isErrorSnackBarVisible = true ) } }, @@ -75,8 +75,8 @@ class BookmarkSheetViewModel @Inject constructor( updateState { copy( selectedLists = emptyList(), - isErrorSnackbarVisible = false, - isSuccessSnackbarVisible = false, + isErrorSnackBarVisible = false, + isSuccessSnackBarVisible = false, shouldDismiss = false, error = null, ) @@ -95,11 +95,11 @@ class BookmarkSheetViewModel @Inject constructor( override fun onCreateNewList() = emitEffect(BookmarkSheetEffect.NewListCreation) - override fun onSnackbarShown() { + override fun onSnackBarShown() { updateState { copy( - isSuccessSnackbarVisible = false, - isErrorSnackbarVisible = false, + isSuccessSnackBarVisible = false, + isErrorSnackBarVisible = false, error = null ) } diff --git a/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/mapper.kt b/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/mapper.kt index 3f56ca440..9a5f24fce 100644 --- a/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/mapper.kt +++ b/presentation/src/main/java/com/london/presentation/shared/bookmarkSheet/mapper.kt @@ -9,4 +9,4 @@ fun List.toBookmarkUiLists(): List = name = movieList.name, itemCount = movieList.moviesCount ) - } \ No newline at end of file + } diff --git a/presentation/src/main/java/com/london/presentation/shared/buildscreen/BuildScreen.kt b/presentation/src/main/java/com/london/presentation/shared/buildscreen/BuildScreen.kt index 941d0e5c6..b5b0f56a4 100644 --- a/presentation/src/main/java/com/london/presentation/shared/buildscreen/BuildScreen.kt +++ b/presentation/src/main/java/com/london/presentation/shared/buildscreen/BuildScreen.kt @@ -11,7 +11,6 @@ import com.london.presentation.utils.isEmpty import com.london.presentation.utils.isNotNull import com.london.presentation.utils.shouldShowLoading - @Composable fun BuildScreen( isLoading: Boolean = false, @@ -24,13 +23,14 @@ fun BuildScreen( handlePagingLoadingAutomatically: Boolean = true, content: @Composable () -> Unit, ) { - when { shouldShowLoading( isLoading = isLoading, handlePagingLoadingAutomatically = handlePagingLoadingAutomatically, pagingFlow = pagingFlow - ) -> { LoadingScreen() } + ) -> { + LoadingScreen() + } isError || (pagingFlow?.loadState?.refresh is LoadState.Error) -> { NetworkErrorScreen(onBack = onBack, onRetry = onRetry) @@ -43,7 +43,9 @@ fun BuildScreen( ) } - else -> { content() } + else -> { + content() + } } } @@ -64,13 +66,17 @@ fun BuildScreen( ) { when { - isGuest && guestContent != null -> { guestContent.invoke() } + isGuest && guestContent != null -> { + guestContent.invoke() + } shouldShowLoading( isLoading = isLoading, handlePagingLoadingAutomatically = handlePagingLoadingAutomatically, pagingFlow = pagingFlow - ) -> { LoadingScreen() } + ) -> { + LoadingScreen() + } isError || (pagingFlow?.loadState?.refresh is LoadState.Error) -> { NetworkErrorScreen(onBack = onBack, onRetry = onRetry) @@ -78,17 +84,19 @@ fun BuildScreen( - (pagingFlow!=null) && - pagingFlow.isEmpty() && - emptyLayoutMessage.isNotNull() -> { + (pagingFlow != null) && + pagingFlow.isEmpty() && + emptyLayoutMessage.isNotNull() -> { EmptyLayout( text = stringResource(emptyLayoutMessage!!), image = emptyLayoutImage ?: 0 ) } + pagingFlow != null && - pagingFlow.isEmpty() && - emptyContent != null -> emptyContent() + pagingFlow.isEmpty() && + emptyContent != null -> emptyContent() + else -> { content() } diff --git a/presentation/src/main/java/com/london/presentation/shared/buildscreen/LoadingScreen.kt b/presentation/src/main/java/com/london/presentation/shared/buildscreen/LoadingScreen.kt index 8a4339b83..83da668f5 100644 --- a/presentation/src/main/java/com/london/presentation/shared/buildscreen/LoadingScreen.kt +++ b/presentation/src/main/java/com/london/presentation/shared/buildscreen/LoadingScreen.kt @@ -12,7 +12,7 @@ fun LoadingScreen() { Box( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center - ){ + ) { CircularLoading() } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/buildscreen/NetworkErrorScreen.kt b/presentation/src/main/java/com/london/presentation/shared/buildscreen/NetworkErrorScreen.kt index 7999afec3..ab9f714fb 100644 --- a/presentation/src/main/java/com/london/presentation/shared/buildscreen/NetworkErrorScreen.kt +++ b/presentation/src/main/java/com/london/presentation/shared/buildscreen/NetworkErrorScreen.kt @@ -22,9 +22,9 @@ import com.london.designsystem.theme.NovixTheme @Composable fun NetworkErrorScreen( + onBack: (() -> Unit)?, modifier: Modifier = Modifier, onRetry: () -> Unit = {}, - onBack: (() -> Unit)? ) { Box( modifier @@ -64,6 +64,7 @@ fun NetworkErrorScreen( color = NovixTheme.colors.body, textAlign = TextAlign.Center ) + OutlineButton( text = stringResource(com.london.presentation.R.string.retry), hasLabel = true, diff --git a/presentation/src/main/java/com/london/presentation/shared/container/MediaGridConfig.kt b/presentation/src/main/java/com/london/presentation/shared/container/MediaGridConfig.kt index 2503612f8..890a6847a 100644 --- a/presentation/src/main/java/com/london/presentation/shared/container/MediaGridConfig.kt +++ b/presentation/src/main/java/com/london/presentation/shared/container/MediaGridConfig.kt @@ -4,16 +4,16 @@ import com.london.presentation.shared.genre.MovieGenreUi import com.london.presentation.shared.genre.TvShowGenreUi data class MediaGridConfig( - val showSaveIcon: Boolean = true, val rate: String? = "", val isDarkMode: Boolean = true, + val showSaveIcon: Boolean = true, val isMovieSelected: Boolean = true, + val onSaveClick: (Any) -> Unit = {}, + val onDeleteClick: (Any) -> Unit = {}, val isTvShowSelected: Boolean = false, - val selectedMovieGenre: MovieGenreUi = MovieGenreUi.All, - val selectedTvShowGenre: TvShowGenreUi = TvShowGenreUi.All, val onNavigateToMovie: (Int) -> Unit = {}, val onNavigateToTvShow: (Int) -> Unit = {}, - val onSaveClick: (Any) -> Unit = {}, val isItemSaved: (Any) -> Boolean = { false }, - val onDeleteClick: (Any) -> Unit = {} + val selectedMovieGenre: MovieGenreUi = MovieGenreUi.All, + val selectedTvShowGenre: TvShowGenreUi = TvShowGenreUi.All, ) diff --git a/presentation/src/main/java/com/london/presentation/shared/container/MediaLazyGridWithFilter.kt b/presentation/src/main/java/com/london/presentation/shared/container/MediaLazyGridWithFilter.kt index ba315e24c..8fb81abf1 100644 --- a/presentation/src/main/java/com/london/presentation/shared/container/MediaLazyGridWithFilter.kt +++ b/presentation/src/main/java/com/london/presentation/shared/container/MediaLazyGridWithFilter.kt @@ -21,11 +21,11 @@ fun MediaLazyGridWithFilter( modifier: Modifier = Modifier, isLoading: Boolean = false, name: (T) -> String = { it.getName() }, - imageUrl: (T) -> String? = { it.getImageUrl() }, + topBar: @Composable (() -> Unit)? = null, + config: MediaGridConfig = MediaGridConfig(), onMovieGenreClick: (MovieGenreUi) -> Unit = {}, + imageUrl: (T) -> String? = { it.getImageUrl() }, onTvShowGenreClick: (TvShowGenreUi) -> Unit = {}, - config: MediaGridConfig = MediaGridConfig(), - topBar: @Composable (() -> Unit)? = null ) { Column( diff --git a/presentation/src/main/java/com/london/presentation/shared/container/MediaLazyGridWithTabs.kt b/presentation/src/main/java/com/london/presentation/shared/container/MediaLazyGridWithTabs.kt index cdd456818..65eb16dd3 100644 --- a/presentation/src/main/java/com/london/presentation/shared/container/MediaLazyGridWithTabs.kt +++ b/presentation/src/main/java/com/london/presentation/shared/container/MediaLazyGridWithTabs.kt @@ -185,4 +185,4 @@ private fun Preview() { onDeleteClick = {} ) ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/com/london/presentation/shared/container/MediaLazyVerticalGrid.kt b/presentation/src/main/java/com/london/presentation/shared/container/MediaLazyVerticalGrid.kt index 7fe5562ce..2cc61cabf 100644 --- a/presentation/src/main/java/com/london/presentation/shared/container/MediaLazyVerticalGrid.kt +++ b/presentation/src/main/java/com/london/presentation/shared/container/MediaLazyVerticalGrid.kt @@ -27,17 +27,17 @@ import com.london.presentation.utils.gridColumns fun MediaLazyVerticalGrid( items: List, modifier: Modifier = Modifier, - rate: (T) -> String? = { null }, - name: (T) -> String = { it.getName() }, - imageUrl: (T) -> String? = { it.getImageUrl() }, hasSaveIcon: Boolean = true, onSaveClick: (T) -> Unit = {}, - isItemSaved: (T) -> Boolean = { false }, - onItemClick: ((T) -> Unit)? = null, onDeleteClick: (T) -> Unit = {}, + rate: (T) -> String? = { null }, + onItemClick: ((T) -> Unit)? = null, onNavigateToMovie: (Int) -> Unit = {}, onNavigateToTvShow: (Int) -> Unit = {}, - topBar: @Composable (() -> Unit)? = null + name: (T) -> String = { it.getName() }, + isItemSaved: (T) -> Boolean = { false }, + topBar: @Composable (() -> Unit)? = null, + imageUrl: (T) -> String? = { it.getImageUrl() }, ) { MediaGridContainer( modifier = modifier, diff --git a/presentation/src/main/java/com/london/presentation/utils/SearchUtils.kt b/presentation/src/main/java/com/london/presentation/utils/SearchUtils.kt index 9fb4cbb60..01030cc2c 100644 --- a/presentation/src/main/java/com/london/presentation/utils/SearchUtils.kt +++ b/presentation/src/main/java/com/london/presentation/utils/SearchUtils.kt @@ -1,8 +1,6 @@ package com.london.presentation.utils import androidx.compose.runtime.Composable -import com.london.presentation.R -import com.london.presentation.feature.search.SearchCategory @Composable fun ResultOrEmpty( @@ -17,54 +15,3 @@ fun ResultOrEmpty( content() } } - -fun convertGenreCodeToString(genreId: Int, searchCategory: SearchCategory): Int { - return when (searchCategory) { - SearchCategory.Movies -> { - when (genreId) { - 28 -> R.string.action - 12 -> R.string.adventure - 16 -> R.string.animation - 35 -> R.string.comedy - 80 -> R.string.crime - 99 -> R.string.documentary - 18 -> R.string.drama - 10751 -> R.string.family - 14 -> R.string.fantasy - 36 -> R.string.history - 27 -> R.string.horror - 10402 -> R.string.music - 9648 -> R.string.mystery - 10749 -> R.string.romance - 878 -> R.string.sci_fi - 10770 -> R.string.tv_movie - 53 -> R.string.thriller - 10752 -> R.string.war - 37 -> R.string.western - else -> R.string.unknown - } - } - SearchCategory.TvShows -> { - when (genreId) { - 10759 -> R.string.action - 16 -> R.string.animation - 35 -> R.string.comedy - 80 -> R.string.crime - 99 -> R.string.documentary - 18 -> R.string.drama - 10751 -> R.string.family - 10762 -> R.string.kids - 9648 -> R.string.mystery - 10763 -> R.string.news - 10764 -> R.string.reality - 10765 -> R.string.sci_fi - 10766 -> R.string.soap - 10767 -> R.string.talk - 10768 -> R.string.war - 37 -> R.string.western - else -> R.string.action - } - } - SearchCategory.Actors -> R.string.unknown - } -} \ No newline at end of file diff --git a/presentation/src/main/java/com/london/presentation/utils/effectListener.kt b/presentation/src/main/java/com/london/presentation/utils/effectListener.kt index c5b201452..3625f84c5 100644 --- a/presentation/src/main/java/com/london/presentation/utils/effectListener.kt +++ b/presentation/src/main/java/com/london/presentation/utils/effectListener.kt @@ -4,7 +4,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import kotlinx.coroutines.CoroutineScope - @Composable fun E.Listen(onEffect: suspend CoroutineScope.(currentEffect: E) -> Unit) { LaunchedEffect(key1 = this) { diff --git a/presentation/src/main/java/com/london/presentation/utils/extentions.kt b/presentation/src/main/java/com/london/presentation/utils/extensions.kt similarity index 100% rename from presentation/src/main/java/com/london/presentation/utils/extentions.kt rename to presentation/src/main/java/com/london/presentation/utils/extensions.kt diff --git a/presentation/src/main/java/com/london/presentation/utils/HomeMapper.kt b/presentation/src/main/java/com/london/presentation/utils/homeMapper.kt similarity index 99% rename from presentation/src/main/java/com/london/presentation/utils/HomeMapper.kt rename to presentation/src/main/java/com/london/presentation/utils/homeMapper.kt index ee3b06776..0dd1cb854 100644 --- a/presentation/src/main/java/com/london/presentation/utils/HomeMapper.kt +++ b/presentation/src/main/java/com/london/presentation/utils/homeMapper.kt @@ -48,4 +48,4 @@ fun List.toPopularUiMedia() = name = media.name, rating = media.rating.toString(), ) - } \ No newline at end of file + } diff --git a/presentation/src/main/java/com/london/presentation/utils/mediaToRecentViewedMapper.kt b/presentation/src/main/java/com/london/presentation/utils/mediaToRecentViewedMapper.kt index 2bb45d43e..061448b6b 100644 --- a/presentation/src/main/java/com/london/presentation/utils/mediaToRecentViewedMapper.kt +++ b/presentation/src/main/java/com/london/presentation/utils/mediaToRecentViewedMapper.kt @@ -5,16 +5,15 @@ import com.london.domain.entity.recent.RecentViewed import com.london.domain.entity.shared.MediaType import com.london.domain.entity.tvshow.TvShow -fun Movie.toRecentViewed(): RecentViewed= - RecentViewed( +fun Movie.toRecentViewed(): RecentViewed = + RecentViewed( id = this.id, imageUrl = this.posterUrl, type = MediaType.Movie, viewDate = System.currentTimeMillis() ) - -fun TvShow.toRecentViewed(): RecentViewed= RecentViewed( +fun TvShow.toRecentViewed(): RecentViewed = RecentViewed( id = this.id, imageUrl = this.posterPicture, type = MediaType.TvShow, diff --git a/presentation/src/main/java/com/london/presentation/utils/pagingExtensions.kt b/presentation/src/main/java/com/london/presentation/utils/pagingExtensions.kt index 0a5b1e1d0..7274cb6dd 100644 --- a/presentation/src/main/java/com/london/presentation/utils/pagingExtensions.kt +++ b/presentation/src/main/java/com/london/presentation/utils/pagingExtensions.kt @@ -7,7 +7,6 @@ import androidx.paging.map import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map - fun Flow>.update(transform: (T) -> T): Flow> = map { pagingData -> pagingData.map(transform = transform) } @@ -16,12 +15,9 @@ fun Flow>.update(transform: (T) -> R): Flow pagingData.map(transform = transform) } fun LazyPagingItems.isNotEmpty(): Boolean = itemSnapshotList.isNotEmpty() -fun LazyPagingItems.isEmpty(): Boolean = itemSnapshotList.isEmpty() -fun LazyPagingItems.getOrNull(index: Int): T? = runCatching { this[index] }.getOrNull() +fun LazyPagingItems.isEmpty(): Boolean = itemSnapshotList.isEmpty() fun LazyPagingItems.isLoading(): Boolean = loadState.refresh is LoadState.Loading -fun LazyPagingItems.isAppendLoading(): Boolean = loadState.append is LoadState.Loading fun LazyPagingItems.isError(): Boolean = loadState.refresh is LoadState.Error -fun LazyPagingItems.isAppendError(): Boolean = loadState.append is LoadState.Error diff --git a/presentation/src/main/java/com/london/presentation/utils/themeAwarePainter.kt b/presentation/src/main/java/com/london/presentation/utils/themeAwarePainter.kt index 80a950cd2..862665031 100644 --- a/presentation/src/main/java/com/london/presentation/utils/themeAwarePainter.kt +++ b/presentation/src/main/java/com/london/presentation/utils/themeAwarePainter.kt @@ -9,4 +9,4 @@ import com.london.designsystem.utils.painter fun getThemeAwarePainter( @DrawableRes lightThemeRes: Int, @DrawableRes darkThemeRes: Int -) = (if (NovixTheme.isThemeDark) darkThemeRes else lightThemeRes).painter \ No newline at end of file +) = (if (NovixTheme.isThemeDark) darkThemeRes else lightThemeRes).painter diff --git a/presentation/src/main/java/com/london/presentation/utils/Utils.kt b/presentation/src/main/java/com/london/presentation/utils/utils.kt similarity index 87% rename from presentation/src/main/java/com/london/presentation/utils/Utils.kt rename to presentation/src/main/java/com/london/presentation/utils/utils.kt index 445363636..307d04bd6 100644 --- a/presentation/src/main/java/com/london/presentation/utils/Utils.kt +++ b/presentation/src/main/java/com/london/presentation/utils/utils.kt @@ -1,14 +1,9 @@ package com.london.presentation.utils import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalWindowInfo -import androidx.compose.ui.unit.Density -import androidx.compose.ui.unit.DpSize -import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.toSize import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import java.util.Locale @@ -86,7 +81,6 @@ fun convertDate(input: String): String { } } } - return "$day $monthName $year".toLocalizedNumbers() } @@ -94,7 +88,6 @@ fun getLocalizedTimeUnit(unit: String): String { val lang = Locale.getDefault().language val arMap = mapOf("h" to "س", "m" to "د", "s" to "ث") val enMap = mapOf("h" to "h", "m" to "m", "s" to "s") - val key = unit.lowercase() return when (lang) { "ar" -> arMap[key] ?: unit @@ -102,7 +95,6 @@ fun getLocalizedTimeUnit(unit: String): String { } } - fun reverseDateFormat(input: String): String { var day = "" var month = "" @@ -128,17 +120,6 @@ fun Double.isNotZeroRate() = runCatching { this != 0.0 }.getOrDefault(false) -fun IntSize.toDpSize(density: Density): DpSize = with(density) { - toSize().toDpSize() -} - -@Composable -fun rememberContainerSize(): DpSize { - val density = LocalDensity.current - val windowInfo = LocalWindowInfo.current - return remember(windowInfo, density) { windowInfo.containerSize.toDpSize(density) } -} - @Composable fun gridColumns(itemWidth: Int = 158): Int = runCatching { val screenWidth = LocalWindowInfo.current.containerSize.width @@ -156,5 +137,4 @@ fun shouldShowLoading( handlePagingLoadingAutomatically: Boolean = true, pagingFlow: LazyPagingItems<*>? = null ): Boolean = isLoading || (handlePagingLoadingAutomatically - && pagingFlow?.loadState?.refresh is LoadState.Loading) - + && pagingFlow?.loadState?.refresh is LoadState.Loading) diff --git a/presentation/src/main/res/values-ar/strings.xml b/presentation/src/main/res/values-ar/strings.xml index 52f8c9583..fc7131cd4 100644 --- a/presentation/src/main/res/values-ar/strings.xml +++ b/presentation/src/main/res/values-ar/strings.xml @@ -149,6 +149,7 @@ تم حذف الفيلم بنجاح الفيلم غير موجود تم اضافه القائمه بنجاح + تم حذف القائمة بنجاح حدث خطا ما لا يمكن اضافه القائمه تم حذف القائمة بنجاح لا توجد عناصر هنا! diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 6d45ee8eb..41ae0c138 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -149,8 +149,9 @@ movie removed successfully movie not found List added successfully - Something went wrong, can not delete list - list added successfuly + Something went wrong, can not add list + list added successfully + list removed successfully can not delete list Delete rating successfully"> There is no items here! diff --git a/presentation/src/test/java/com/london/presentation/feature/category/movie/MovieCategoryViewModelTest.kt b/presentation/src/test/java/com/london/presentation/feature/category/movie/MovieCategoryViewModelTest.kt index 3e3147439..7e3aece55 100644 --- a/presentation/src/test/java/com/london/presentation/feature/category/movie/MovieCategoryViewModelTest.kt +++ b/presentation/src/test/java/com/london/presentation/feature/category/movie/MovieCategoryViewModelTest.kt @@ -40,7 +40,7 @@ class MovieCategoryViewModelTest { every { savedStateHandle.getArgs() } returns Screen.MoviesByCategory( category = CATEGORY, ) - viewModel = MovieCategoryViewModel(getMovieUseCase, savedStateHandle) + viewModel = MovieCategoryViewModel(savedStateHandle, getMovieUseCase) coEvery { getMovieUseCase.getMoviesByGenre(CATEGORY.toDomain(), PAGE) } returns moviesPagingData } diff --git a/presentation/src/test/java/com/london/presentation/feature/category/tvshow/TvShowCategoryViewModelTest.kt b/presentation/src/test/java/com/london/presentation/feature/category/tvshow/TvShowCategoryViewModelTest.kt index c1f4bf03d..175838be7 100644 --- a/presentation/src/test/java/com/london/presentation/feature/category/tvshow/TvShowCategoryViewModelTest.kt +++ b/presentation/src/test/java/com/london/presentation/feature/category/tvshow/TvShowCategoryViewModelTest.kt @@ -40,7 +40,7 @@ class TvShowCategoryViewModelTest { every { savedStateHandle.getArgs() } returns Screen.TvShowsByCategory( category = CATEGORY, ) - viewModel = TvShowCategoryViewModel(getTvShowUseCase, savedStateHandle) + viewModel = TvShowCategoryViewModel(savedStateHandle, getTvShowUseCase) coEvery { getTvShowUseCase.getTvShowsByGenre( CATEGORY.toDomain(), diff --git a/presentation/src/test/java/com/london/presentation/feature/details/movie/info/MovieDetailsViewModelTest.kt b/presentation/src/test/java/com/london/presentation/feature/details/movie/info/MovieDetailsViewModelTest.kt index 5d94672ff..f3982c4b1 100644 --- a/presentation/src/test/java/com/london/presentation/feature/details/movie/info/MovieDetailsViewModelTest.kt +++ b/presentation/src/test/java/com/london/presentation/feature/details/movie/info/MovieDetailsViewModelTest.kt @@ -76,12 +76,12 @@ class MovieDetailsViewModelTest { } private fun createViewModel() = MovieDetailsViewModel( + savedStateHandle, getMovieUseCase, - manageRecentMovieWatchedUseCase, - manageRecentViewedUseCase, ratingUseCase, authenticationUseCase, - savedStateHandle + manageRecentViewedUseCase, + manageRecentMovieWatchedUseCase, ) @After @@ -307,4 +307,4 @@ class MovieDetailsViewModelTest { private val mockMovieVideos = listOf("video1_url", "video2_url") } -} \ No newline at end of file +}