diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..64ddd76 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*.{kt,kts}] +ktlint_code_style = ktlint_official +ktlint_standard_annotation = disabled +ktlint_standard_trailing-comma-on-call-site = disabled +ktlint_standard_trailing-comma-on-declaration-site = disabled +ktlint_standard_multiline-expression-wrapping = disabled +ktlint_standard_string-template-indent = disabled +ktlint_function_naming_ignore_when_annotated_with = Composable +ktlint_function_signature_body_expression_wrapping = default \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 106dfb3..70bfb40 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -8,6 +8,15 @@ plugins { alias(libs.plugins.detekt) alias(libs.plugins.ksp) alias(libs.plugins.kover) + alias(libs.plugins.ktlint) +} + +ktlint { + version.set(libs.versions.ktlint) + android.set(true) + filter { + exclude("**/generated/**") + } } detekt { @@ -56,7 +65,6 @@ android { project.rootProject.file("properties/urls.properties").inputStream().use { urlProperties.load(it) } - } val serverUrl = if (urlsPropertiesExist) { urlProperties.getProperty("main") @@ -89,7 +97,6 @@ android { value = "\"$metricaToken\"", name = "METRICA_TOKEN", ) - } val securityProperties = Properties() @@ -100,7 +107,6 @@ android { securityProperties.load(it) } - signingConfigs { create("release") { storeFile = rootProject.file("Backgroundable.jks") @@ -130,7 +136,6 @@ android { isDebuggable = true applicationIdSuffix = ".debug" versionNameSuffix = ".debug" - } } @@ -208,10 +213,8 @@ protobuf { } dependencies { - detektPlugins(libs.detektFormatting) - implementation(libs.appcompat) - /*Compose*/ + // Compose implementation(libs.bundles.compose) implementation(libs.activityCompose) implementation(libs.navigationCompose) @@ -220,27 +223,27 @@ dependencies { implementation(libs.lifecycleRuntimeCompose) implementation(libs.coilCompose) - /*coroutine*/ + // coroutine implementation(libs.coroutine) - /*Retrofit*/ + // Retrofit implementation(libs.retrofit) implementation(libs.kotlinxSerialization) implementation(libs.retrofitKotlinxSerializationConverter) - /*dagger*/ + // dagger implementation(libs.dagger) ksp(libs.daggerCompiler) - /*room*/ + // room implementation(libs.bundles.room) ksp(libs.roomCompiler) - /*chucker*/ + // chucker debugImplementation(libs.chucker) releaseImplementation(libs.chuckerNoOp) - /*datastore*/ + // datastore implementation(libs.bundles.datastore) implementation(libs.datastorePreferences) @@ -282,8 +285,7 @@ class RoomSchemaArgProvider( @get:PathSensitive(PathSensitivity.RELATIVE) val schemaDir: File ) : CommandLineArgumentProvider { - override fun asArguments(): Iterable { return listOf("room.schemaLocation=${schemaDir.path}") } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/BackgroundableApplication.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/BackgroundableApplication.kt index 50f9bbc..5f7fd41 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/BackgroundableApplication.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/BackgroundableApplication.kt @@ -16,7 +16,6 @@ import okhttp3.OkHttpClient import java.util.concurrent.TimeUnit class BackgroundableApplication : Application() { - lateinit var appComponent: AppComponent private set diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/common/ui/HexagonShape.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/common/ui/HexagonShape.kt index 6c53db7..666154e 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/common/ui/HexagonShape.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/common/ui/HexagonShape.kt @@ -10,7 +10,6 @@ import java.lang.Float.min import kotlin.math.sqrt object HexagonShape : Shape { - override fun createOutline( size: Size, layoutDirection: LayoutDirection, @@ -29,7 +28,10 @@ fun drawCustomHexagonPath(size: Size): Path { } } -private fun Path.customHexagon(radius: Float, size: Size) { +private fun Path.customHexagon( + radius: Float, + size: Size +) { val triangleHeight = (sqrt(3.0) * radius / 2) val centerX = size.width / 2 val centerY = size.height / 2 diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/common/ui/UiText.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/common/ui/UiText.kt index 0e10381..2909942 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/common/ui/UiText.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/common/ui/UiText.kt @@ -8,6 +8,7 @@ import androidx.compose.ui.res.stringResource @Suppress("SpreadOperator") sealed interface UiText { data class DynamicString(val value: String) : UiText + class StringResource( @StringRes val resId: Int, vararg val args: Any diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/AndroidDownloader.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/AndroidDownloader.kt index 7efbf28..14d909c 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/AndroidDownloader.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/AndroidDownloader.kt @@ -10,7 +10,6 @@ import javax.inject.Inject class AndroidDownloader @Inject constructor( context: Context ) : Downloader { - private val downloadManager = context.getSystemService( DownloadManager::class.java ) diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/AndroidExtensions.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/AndroidExtensions.kt index b0ccaef..f16b3dc 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/AndroidExtensions.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/AndroidExtensions.kt @@ -40,11 +40,17 @@ fun Context.composeMail( } } -fun Context.toast(message: String, duration: Int = Toast.LENGTH_LONG) { +fun Context.toast( + message: String, + duration: Int = Toast.LENGTH_LONG +) { Toast.makeText(this, message, duration).show() } -fun Context.toast(@StringRes stringRes: Int, duration: Int = Toast.LENGTH_LONG) { +fun Context.toast( + @StringRes stringRes: Int, + duration: Int = Toast.LENGTH_LONG +) { Toast.makeText(this, stringRes, duration).show() } @@ -77,7 +83,10 @@ fun File.getUri(context: Context): Uri { ) } -fun Uri.setAsWallpaper(context: Context, onError: (Throwable) -> Unit) { +fun Uri.setAsWallpaper( + context: Context, + onError: (Throwable) -> Unit +) { runCatching { val intent = Intent(Intent.ACTION_ATTACH_DATA) intent.setDataAndType(this, "image/*") diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/AppScreens.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/AppScreens.kt index 37c7874..e7236dd 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/AppScreens.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/AppScreens.kt @@ -6,13 +6,19 @@ internal sealed class AppScreens(val route: String) { data object Search : AppScreens("search") data object MediaList : AppScreens("media-list?id={id}&title={title}") { - fun createRoute(id: String, title: String): String { + fun createRoute( + id: String, + title: String + ): String { return "media-list?id=$id&title=$title" } } data object MediaDetail : AppScreens("media-detail?id={id}&title={title}") { - fun createRoute(id: Int, title: String): String { + fun createRoute( + id: Int, + title: String + ): String { return "media-detail?id=$id&title=$title" } } @@ -20,7 +26,10 @@ internal sealed class AppScreens(val route: String) { data object ColumnCountPicker : AppScreens( "column-count-picker?items={items}?selectedItem={selectedItem}" ) { - fun createRoute(items: String, selectedItem: Int): String { + fun createRoute( + items: String, + selectedItem: Int + ): String { return "column-count-picker?items=$items?selectedItem=$selectedItem" } } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/SnackbarManager.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/SnackbarManager.kt index 4f215df..f427ece 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/SnackbarManager.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/SnackbarManager.kt @@ -9,7 +9,6 @@ import javax.inject.Singleton @Singleton class SnackbarManager @Inject constructor() { - private val channel = Channel( capacity = 5, onBufferOverflow = BufferOverflow.DROP_OLDEST diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/AsyncJob.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/AsyncJob.kt index d90a87b..fda3004 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/AsyncJob.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/AsyncJob.kt @@ -2,7 +2,10 @@ package ir.thatsmejavad.backgroundable.core.sealeds sealed interface AsyncJob { data class Success(val value: T) : AsyncJob + data class Fail(val exception: Throwable) : AsyncJob + data object Loading : AsyncJob + data object Uninitialized : AsyncJob } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/ImageQuality.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/ImageQuality.kt index 037d2be..42e241b 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/ImageQuality.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/ImageQuality.kt @@ -5,9 +5,13 @@ import ir.thatsmejavad.backgroundable.R sealed interface ImageQuality { data object Low : ImageQuality + data object Medium : ImageQuality + data object High : ImageQuality + data object Ultra : ImageQuality + companion object { fun toImageQuality(quality: Quality): ImageQuality { return when (quality) { diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/List.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/List.kt index 149820b..206e7d6 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/List.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/List.kt @@ -4,7 +4,9 @@ import ir.thatsmejavad.backgroundable.ListType as ProtoListType sealed interface List { data object ListType : List + data object GridType : List + data object StaggeredType : List companion object { diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/ResourceSize.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/ResourceSize.kt index 87769fc..104f125 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/ResourceSize.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/ResourceSize.kt @@ -4,12 +4,19 @@ import ir.thatsmejavad.backgroundable.R sealed class ResourceSize(val size: String) { data object Original : ResourceSize("original") + data object Large2x : ResourceSize("large2x") + data object Large : ResourceSize("large") + data object Medium : ResourceSize("medium") + data object Small : ResourceSize("small") + data object Portrait : ResourceSize("portrait"), OrientationMode + data object Landscape : ResourceSize("landscape"), OrientationMode + data object Tiny : ResourceSize("tiny") companion object { diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/Theme.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/Theme.kt index 8049780..356b962 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/Theme.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/Theme.kt @@ -4,8 +4,11 @@ import ir.thatsmejavad.backgroundable.ThemeType sealed interface Theme { data object DarkTheme : Theme + data object LightTheme : Theme + data object FollowSystem : Theme + companion object { fun toTheme(theme: ThemeType): Theme { return when (theme) { diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/ThemeColor.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/ThemeColor.kt index a6fd699..12d5888 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/ThemeColor.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/sealeds/ThemeColor.kt @@ -4,16 +4,20 @@ import ir.thatsmejavad.backgroundable.ThemeName sealed interface ThemeColor { data object Ao : ThemeColor + data object Skobeloff : ThemeColor + data object BlueViolet : ThemeColor + data object MiddleRed : ThemeColor + data object Crayola : ThemeColor data object Indigo : ThemeColor companion object { - val items = listOf(Skobeloff, Ao, BlueViolet, MiddleRed, Crayola, Indigo) + fun fromThemeColor(color: ThemeColor): ThemeName { return when (color) { Ao -> ThemeName.THEME_AO diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/viewmodel/DaggerViewModelAssistedFactory.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/viewmodel/DaggerViewModelAssistedFactory.kt index d2ac386..a1a512d 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/viewmodel/DaggerViewModelAssistedFactory.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/viewmodel/DaggerViewModelAssistedFactory.kt @@ -5,14 +5,20 @@ import androidx.lifecycle.ViewModel import javax.inject.Inject import javax.inject.Provider +@Suppress( + "ktlint:standard:parameter-list-spacing", + "ktlint:standard:indent", +) class DaggerViewModelAssistedFactory @Inject constructor( private val assistedFactoryMap: Map, @JvmSuppressWildcards Provider>>, private val viewModels: Map, @JvmSuppressWildcards Provider>, ) : ViewModelFactory { - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class, handle: SavedStateHandle): VM { + override fun create( + modelClass: Class, + handle: SavedStateHandle + ): VM { val creator = assistedFactoryMap[modelClass] ?: assistedFactoryMap.asIterable() diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/viewmodel/ViewModelFactory.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/viewmodel/ViewModelFactory.kt index 2b32cc8..ff9a980 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/viewmodel/ViewModelFactory.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/core/viewmodel/ViewModelFactory.kt @@ -4,5 +4,8 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel interface ViewModelFactory { - fun create(modelClass: Class, handle: SavedStateHandle): VM + fun create( + modelClass: Class, + handle: SavedStateHandle + ): VM } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/local/PageKeyLocalDataSource.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/local/PageKeyLocalDataSource.kt index 27a270a..b8e2fc5 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/local/PageKeyLocalDataSource.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/local/PageKeyLocalDataSource.kt @@ -3,7 +3,6 @@ package ir.thatsmejavad.backgroundable.data.datasource.local import ir.thatsmejavad.backgroundable.data.db.entity.PageKeyEntity interface PageKeyLocalDataSource { - suspend fun insertPageKey(pageKey: PageKeyEntity) suspend fun getPageKeyById(id: String): PageKeyEntity? diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/local/PageKeyLocalDataSourceImpl.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/local/PageKeyLocalDataSourceImpl.kt index a40b39a..1d1d102 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/local/PageKeyLocalDataSourceImpl.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/local/PageKeyLocalDataSourceImpl.kt @@ -7,7 +7,6 @@ import javax.inject.Inject class PageKeyLocalDataSourceImpl @Inject constructor( private val pageKeyDao: PageKeyDao, ) : PageKeyLocalDataSource { - override suspend fun insertPageKey(pageKey: PageKeyEntity) { pageKeyDao.insertPageKey(pageKey) } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/local/ResourceLocalDataSource.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/local/ResourceLocalDataSource.kt index 8a9fad9..9e90048 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/local/ResourceLocalDataSource.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/local/ResourceLocalDataSource.kt @@ -3,7 +3,6 @@ package ir.thatsmejavad.backgroundable.data.datasource.local import ir.thatsmejavad.backgroundable.data.db.entity.ResourceEntity interface ResourceLocalDataSource { - suspend fun insertResources(resources: List) suspend fun deleteAll() diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/CollectionRemoteDataSource.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/CollectionRemoteDataSource.kt index 25f9337..017aa2a 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/CollectionRemoteDataSource.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/CollectionRemoteDataSource.kt @@ -4,6 +4,5 @@ import ir.thatsmejavad.backgroundable.model.Collection import ir.thatsmejavad.backgroundable.model.PagedResponse interface CollectionRemoteDataSource { - suspend fun getCollections(page: Int): PagedResponse } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/CollectionRemoteMediator.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/CollectionRemoteMediator.kt index fadc526..bafdde8 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/CollectionRemoteMediator.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/CollectionRemoteMediator.kt @@ -20,7 +20,6 @@ class CollectionRemoteMediator( private val database: BackgroundableDatabase, private val pageKeyLocalDataSource: PageKeyLocalDataSource, ) : RemoteMediator() { - private var pageKeyEntity: PageKeyEntity? = null override suspend fun initialize(): InitializeAction { diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/MediaRemoteDataSource.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/MediaRemoteDataSource.kt index e3227ca..2c25692 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/MediaRemoteDataSource.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/MediaRemoteDataSource.kt @@ -8,7 +8,10 @@ import kotlinx.coroutines.flow.Flow interface MediaRemoteDataSource { suspend fun getMedia(photoId: Int): Media - suspend fun getMediasByCollectionId(collectionId: String, page: Int): PagedResponse + suspend fun getMediasByCollectionId( + collectionId: String, + page: Int + ): PagedResponse fun searchPhoto(query: String): Flow> } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/MediaRemoteDataSourceImpl.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/MediaRemoteDataSourceImpl.kt index 7bb58c5..9b65eb0 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/MediaRemoteDataSourceImpl.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/MediaRemoteDataSourceImpl.kt @@ -28,9 +28,7 @@ class MediaRemoteDataSourceImpl @Inject constructor( ).bodyOrException() } - override fun searchPhoto( - query: String, - ): Flow> { + override fun searchPhoto(query: String): Flow> { return Pager( config = PagingConfig( pageSize = MEDIA_PER_PAGE_ITEM, diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/MediaRemoteMediator.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/MediaRemoteMediator.kt index 7cbd4f6..cf68367 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/MediaRemoteMediator.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datasource/remote/MediaRemoteMediator.kt @@ -25,7 +25,6 @@ class MediaRemoteMediator( private val collectionId: String, private val database: BackgroundableDatabase, ) : RemoteMediator() { - private var pageKeyEntity: PageKeyEntity? = null override suspend fun initialize(): InitializeAction { diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datastore/UserPreferencesSerializer.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datastore/UserPreferencesSerializer.kt index dd10ea5..e2b56c0 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datastore/UserPreferencesSerializer.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/datastore/UserPreferencesSerializer.kt @@ -18,7 +18,10 @@ object UserPreferencesSerializer : Serializer { } } - override suspend fun writeTo(t: UserPref, output: OutputStream) { + override suspend fun writeTo( + t: UserPref, + output: OutputStream + ) { t.writeTo(output) } } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/BackgroundableDatabase.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/BackgroundableDatabase.kt index 187286a..df86ba7 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/BackgroundableDatabase.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/BackgroundableDatabase.kt @@ -35,7 +35,10 @@ import ir.thatsmejavad.backgroundable.data.db.entity.ResourceEntity ) abstract class BackgroundableDatabase : RoomDatabase() { abstract fun resourceDao(): ResourceDao + abstract fun collectionDao(): CollectionDao + abstract fun mediaDao(): MediaDao + abstract fun pageKeyDao(): PageKeyDao } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/converter/ResourceSizeConverter.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/converter/ResourceSizeConverter.kt index 3da2aeb..e9c7d0e 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/converter/ResourceSizeConverter.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/converter/ResourceSizeConverter.kt @@ -4,7 +4,6 @@ import androidx.room.TypeConverter import ir.thatsmejavad.backgroundable.core.sealeds.ResourceSize class ResourceSizeConverter { - @TypeConverter fun fromResourceSize(resourceSize: ResourceSize): String { return resourceSize.size diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/dao/CollectionDao.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/dao/CollectionDao.kt index b51d60e..f79b2e0 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/dao/CollectionDao.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/dao/CollectionDao.kt @@ -9,7 +9,6 @@ import ir.thatsmejavad.backgroundable.data.db.entity.CollectionEntity @Dao interface CollectionDao { - @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun insertCollections(collections: List) diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/dao/ResourceDao.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/dao/ResourceDao.kt index 2a6a461..bd7fdfd 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/dao/ResourceDao.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/dao/ResourceDao.kt @@ -8,7 +8,6 @@ import ir.thatsmejavad.backgroundable.data.db.entity.ResourceEntity @Dao interface ResourceDao { - @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun insertResources(list: List) diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/entity/MediaEntity.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/entity/MediaEntity.kt index f3217f9..be99236 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/entity/MediaEntity.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/entity/MediaEntity.kt @@ -14,22 +14,16 @@ data class MediaEntity( val url: String, val alt: String, val type: MediaType, - @ColumnInfo(name = "collection-id") val collectionId: String?, - @ColumnInfo(index = true) val photographer: String, - @ColumnInfo(name = "avg-color", index = true) val avgColor: String, - @ColumnInfo("photographer-id") val photographerId: Int, - @ColumnInfo("photographer-url") val photographerUrl: String, - // we should save orderId because server data is shuffled,and we should sort the data to fix jump in screen. @ColumnInfo("order-id") @PrimaryKey(autoGenerate = true) diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/entity/PageKeyEntity.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/entity/PageKeyEntity.kt index f65aa49..3e0dc06 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/entity/PageKeyEntity.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/entity/PageKeyEntity.kt @@ -9,12 +9,9 @@ data class PageKeyEntity( @PrimaryKey @ColumnInfo(name = "collection-id") val collectionId: String, - @ColumnInfo(name = "last-loaded-page") val lastLoadedPage: Int, - @ColumnInfo(name = "max-page") val maxPage: Int, - val timestamp: Long = System.currentTimeMillis() ) diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/entity/ResourceEntity.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/entity/ResourceEntity.kt index fee5b09..6b841a9 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/entity/ResourceEntity.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/entity/ResourceEntity.kt @@ -20,7 +20,6 @@ import ir.thatsmejavad.backgroundable.core.sealeds.ResourceSize ] ) data class ResourceEntity( - @ColumnInfo(name = "media-id") val mediaId: Int, val size: ResourceSize, diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/relation/MediaWithResources.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/relation/MediaWithResources.kt index 2a1d421..1efbe96 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/relation/MediaWithResources.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/db/relation/MediaWithResources.kt @@ -7,7 +7,6 @@ import ir.thatsmejavad.backgroundable.data.db.entity.ResourceEntity data class MediaWithResources( @Embedded val media: MediaEntity, - @Relation( parentColumn = "id", entityColumn = "media-id", diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/MediaRepository.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/MediaRepository.kt index 35fabff..6d62709 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/MediaRepository.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/MediaRepository.kt @@ -7,7 +7,6 @@ import ir.thatsmejavad.backgroundable.model.media.Media import kotlinx.coroutines.flow.Flow interface MediaRepository { - fun getMediasByCollectionId(collectionId: String): Flow> suspend fun getMediaWithResources(id: Int): MediaWithResources? diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/MediaRepositoryImpl.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/MediaRepositoryImpl.kt index 43b7c11..5f6737b 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/MediaRepositoryImpl.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/MediaRepositoryImpl.kt @@ -32,10 +32,7 @@ class MediaRepositoryImpl @Inject constructor( private val database: BackgroundableDatabase, private val userPreferencesStore: DataStore, ) : MediaRepository { - - override fun getMediasByCollectionId( - collectionId: String, - ): Flow> { + override fun getMediasByCollectionId(collectionId: String): Flow> { return Pager( config = PagingConfig( pageSize = MEDIA_PER_PAGE_ITEM, diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/SettingRepository.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/SettingRepository.kt index 4ff1c3d..bb0af27 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/SettingRepository.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/SettingRepository.kt @@ -8,8 +8,12 @@ import kotlinx.coroutines.flow.Flow interface SettingRepository { val userPreferencesFlow: Flow + suspend fun setThemeMode(theme: Theme) + suspend fun setMaterialYouIsEnabled(enable: Boolean) + suspend fun setImageQuality(imageQuality: ImageQuality) + suspend fun setThemeColor(color: ThemeColor) } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/SettingRepositoryImpl.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/SettingRepositoryImpl.kt index eec974c..5c1779e 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/SettingRepositoryImpl.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/data/repository/SettingRepositoryImpl.kt @@ -16,7 +16,6 @@ import javax.inject.Inject class SettingRepositoryImpl @Inject constructor( private val userPreferencesStore: DataStore ) : SettingRepository { - override val userPreferencesFlow: Flow = userPreferencesStore.data .catch { exception -> if (exception is IOException) { diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/components/ActivityViewModelComponent.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/components/ActivityViewModelComponent.kt index 2feb3e0..93f69d1 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/components/ActivityViewModelComponent.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/components/ActivityViewModelComponent.kt @@ -8,11 +8,11 @@ import ir.thatsmejavad.backgroundable.main.MainActivity @Subcomponent(modules = [MainViewModelModule::class]) interface ActivityViewModelComponent { - @Subcomponent.Builder interface Builder { @BindsInstance fun componentActivity(activity: ComponentActivity): Builder + fun build(): ActivityViewModelComponent } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/components/AppComponent.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/components/AppComponent.kt index 4c4d22f..39b7a3f 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/components/AppComponent.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/components/AppComponent.kt @@ -15,5 +15,6 @@ import javax.inject.Singleton @Singleton interface AppComponent { fun getViewModelFactory(): ViewModelFactory + fun activityViewModelComponentBuilder(): ActivityViewModelComponent.Builder } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/AppViewModelModule.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/AppViewModelModule.kt index 4f844a0..5bfa556 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/AppViewModelModule.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/AppViewModelModule.kt @@ -24,7 +24,6 @@ import ir.thatsmejavad.backgroundable.screens.settings.themesetting.ThemeSetting ] ) interface AppViewModelModule { - @Binds @[IntoMap ViewModelAssistedFactoryKey(CollectionListViewModel::class)] fun bindsCollectionListViewModelFactory(viewModel: CollectionListViewModel): ViewModel diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/ApplicationModule.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/ApplicationModule.kt index 442c16b..1e4884c 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/ApplicationModule.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/ApplicationModule.kt @@ -8,7 +8,6 @@ import javax.inject.Singleton @Module class ApplicationModule(private val application: Application) { - @Singleton @Provides fun provideApplicationContext(): Context { diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/CollectionModule.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/CollectionModule.kt index c0c4a99..9552a0b 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/CollectionModule.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/CollectionModule.kt @@ -22,17 +22,11 @@ interface CollectionModule { fun bindCollectionRepository(impl: CollectionRepositoryImpl): CollectionRepository @Binds - fun bindCollectionRemoteDataSource( - impl: CollectionRemoteDataSourceImpl - ): CollectionRemoteDataSource + fun bindCollectionRemoteDataSource(impl: CollectionRemoteDataSourceImpl): CollectionRemoteDataSource @Binds - fun bindCollectionLocalDataSource( - impl: CollectionLocalDataSourceImpl - ): CollectionLocalDataSource + fun bindCollectionLocalDataSource(impl: CollectionLocalDataSourceImpl): CollectionLocalDataSource @Binds - fun bindPageKeyLocalDataSource( - impl: PageKeyLocalDataSourceImpl - ): PageKeyLocalDataSource + fun bindPageKeyLocalDataSource(impl: PageKeyLocalDataSourceImpl): PageKeyLocalDataSource } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/DataStoreModule.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/DataStoreModule.kt index 44679af..548f438 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/DataStoreModule.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/DataStoreModule.kt @@ -22,12 +22,9 @@ import javax.inject.Singleton @Module object DataStoreModule { - @Singleton @Provides - fun providePreferencesDataStore( - appContext: Context - ): DataStore { + fun providePreferencesDataStore(appContext: Context): DataStore { return PreferenceDataStoreFactory.create( corruptionHandler = ReplaceFileCorruptionHandler( produceNewData = { emptyPreferences() } @@ -38,9 +35,7 @@ object DataStoreModule { @Singleton @Provides - fun provideUserPreferencesDataStore( - appContext: Context - ): DataStore { + fun provideUserPreferencesDataStore(appContext: Context): DataStore { return DataStoreFactory.create( serializer = UserPreferencesSerializer, produceFile = { appContext.dataStoreFile(USER_PREF_DATA_STORE_FILE_NAME) }, diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/DatabaseModule.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/DatabaseModule.kt index e5a9a62..eb3d90a 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/DatabaseModule.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/DatabaseModule.kt @@ -13,7 +13,6 @@ import javax.inject.Singleton @Module class DatabaseModule { - @Provides @Singleton fun provideDatabase(context: Context): BackgroundableDatabase { @@ -28,25 +27,25 @@ class DatabaseModule { @Provides @Singleton - fun providesCollectionDao( - backgroundableDatabase: BackgroundableDatabase - ): CollectionDao = backgroundableDatabase.collectionDao() + fun providesCollectionDao(backgroundableDatabase: BackgroundableDatabase): CollectionDao { + return backgroundableDatabase.collectionDao() + } @Provides @Singleton - fun provideMediaDao( - backgroundableDatabase: BackgroundableDatabase - ): MediaDao = backgroundableDatabase.mediaDao() + fun provideMediaDao(backgroundableDatabase: BackgroundableDatabase): MediaDao { + return backgroundableDatabase.mediaDao() + } @Provides @Singleton - fun provideResourceDao( - backgroundableDatabase: BackgroundableDatabase - ): ResourceDao = backgroundableDatabase.resourceDao() + fun provideResourceDao(backgroundableDatabase: BackgroundableDatabase): ResourceDao { + return backgroundableDatabase.resourceDao() + } @Provides @Singleton - fun providePageKeyDao( - backgroundableDatabase: BackgroundableDatabase - ): PageKeyDao = backgroundableDatabase.pageKeyDao() + fun providePageKeyDao(backgroundableDatabase: BackgroundableDatabase): PageKeyDao { + return backgroundableDatabase.pageKeyDao() + } } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/MainViewModelModule.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/MainViewModelModule.kt index 01ac8f8..e9c4a1d 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/MainViewModelModule.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/MainViewModelModule.kt @@ -10,7 +10,6 @@ import ir.thatsmejavad.backgroundable.main.MainViewModel @Module class MainViewModelModule { - @Provides fun provideMyViewModel( activity: ComponentActivity, diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/MediaModule.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/MediaModule.kt index 0065c27..4a069a8 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/MediaModule.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/MediaModule.kt @@ -19,22 +19,14 @@ interface MediaModule { fun bindMediaRepository(impl: MediaRepositoryImpl): MediaRepository @Binds - fun bindMediaRemoteDataSource( - impl: MediaRemoteDataSourceImpl - ): MediaRemoteDataSource + fun bindMediaRemoteDataSource(impl: MediaRemoteDataSourceImpl): MediaRemoteDataSource @Binds - fun bindMediaLocalDataSource( - impl: MediaLocalDataSourceImpl - ): MediaLocalDataSource + fun bindMediaLocalDataSource(impl: MediaLocalDataSourceImpl): MediaLocalDataSource @Binds - fun bindResourceLocalDataSource( - impl: ResourceLocalDataSourceImpl - ): ResourceLocalDataSource + fun bindResourceLocalDataSource(impl: ResourceLocalDataSourceImpl): ResourceLocalDataSource @Binds - fun bindAndroidDownloader( - impl: AndroidDownloader - ): Downloader + fun bindAndroidDownloader(impl: AndroidDownloader): Downloader } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/NetworkModule.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/NetworkModule.kt index 5b11f69..62f8db0 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/NetworkModule.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/di/modules/NetworkModule.kt @@ -22,7 +22,6 @@ import javax.inject.Singleton @Module class NetworkModule { - @Singleton @Provides fun provideJson(): Json { @@ -38,9 +37,7 @@ class NetworkModule { @Provides @Singleton - fun provideChuckerInterceptor( - context: Context - ): ChuckerInterceptor { + fun provideChuckerInterceptor(context: Context): ChuckerInterceptor { val chuckerCollector = ChuckerCollector( context = context, showNotification = true, diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/main/MainActivity.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/main/MainActivity.kt index e6207a4..ca9384f 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/main/MainActivity.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/main/MainActivity.kt @@ -61,7 +61,6 @@ import ir.thatsmejavad.backgroundable.ui.BackgroundableTheme import javax.inject.Inject class MainActivity : AppCompatActivity() { - @Inject lateinit var viewModel: MainViewModel diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/main/MainViewModel.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/main/MainViewModel.kt index 531b8cb..dc85b35 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/main/MainViewModel.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/main/MainViewModel.kt @@ -11,7 +11,6 @@ import javax.inject.Inject class MainViewModel @Inject constructor( settingRepository: SettingRepository, ) : ViewModel() { - val userPreferences = settingRepository.userPreferencesFlow.stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(), diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/model/Collection.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/model/Collection.kt index d235df7..ea77e86 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/model/Collection.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/model/Collection.kt @@ -11,7 +11,6 @@ data class Collection( val description: String? = null, val mediaCount: Int, val photosCount: Int, - @SerialName("private") val isPrivate: Boolean, val videosCount: Int, diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/model/media/Media.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/model/media/Media.kt index 0ddad2b..e63537e 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/model/media/Media.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/model/media/Media.kt @@ -21,9 +21,7 @@ data class Media( val photographerId: Int, val photographerUrl: String, ) { - fun toEntity( - collectionId: String? - ) = MediaEntity( + fun toEntity(collectionId: String?) = MediaEntity( id = id, width = width, height = height, diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/aboutus/AboutUsScreen.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/aboutus/AboutUsScreen.kt index 9a6bfbb..b57d53c 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/aboutus/AboutUsScreen.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/aboutus/AboutUsScreen.kt @@ -47,9 +47,7 @@ import ir.thatsmejavad.backgroundable.model.Contributor import ir.thatsmejavad.backgroundable.model.ContributorLink @Composable -fun AboutUsScreen( - onBackClicked: () -> Unit -) { +fun AboutUsScreen(onBackClicked: () -> Unit) { val context = LocalContext.current val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState()) diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/collectionlist/CollectionListViewModel.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/collectionlist/CollectionListViewModel.kt index 1c977db..ae705ff 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/collectionlist/CollectionListViewModel.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/collectionlist/CollectionListViewModel.kt @@ -21,7 +21,6 @@ class CollectionListViewModel @Inject constructor( val snackbarManager: SnackbarManager, private val columnCountsPreferences: ColumnCountsPreferences, ) : ViewModel() { - var columnCountPickerData: String = "" private set diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/downloadpicker/DownloadPickerViewModel.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/downloadpicker/DownloadPickerViewModel.kt index 0ea1a9c..f529f60 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/downloadpicker/DownloadPickerViewModel.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/downloadpicker/DownloadPickerViewModel.kt @@ -23,7 +23,6 @@ class DownloadPickerViewModel @AssistedInject constructor( @Assisted private val savedStateHandle: SavedStateHandle, private val downloader: Downloader, ) : ViewModel() { - @AssistedFactory interface Factory : ViewModelAssistedFactory diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/mediadetail/MediaDetailViewModel.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/mediadetail/MediaDetailViewModel.kt index d887b95..c811356 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/mediadetail/MediaDetailViewModel.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/mediadetail/MediaDetailViewModel.kt @@ -35,7 +35,6 @@ class MediaDetailViewModel @AssistedInject constructor( settingRepository: SettingRepository, @Assisted private val savedStateHandle: SavedStateHandle, ) : ViewModel() { - @AssistedFactory interface Factory : ViewModelAssistedFactory @@ -107,5 +106,6 @@ class MediaDetailViewModel @AssistedInject constructor( sealed interface SavePurpose { data object SettingWallpaper : SavePurpose + data object Share : SavePurpose } diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/medialist/MediaListScreen.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/medialist/MediaListScreen.kt index f21fd61..7fb2997 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/medialist/MediaListScreen.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/medialist/MediaListScreen.kt @@ -177,7 +177,7 @@ private fun MediaListScreen( initialScale = 0.92f, animationSpec = tween(220, delayMillis = 120) ) - ) + ) .togetherWith(fadeOut(animationSpec = tween(120))) } ) { type -> diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/medialist/MediaListViewModel.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/medialist/MediaListViewModel.kt index cfa47c9..f12e57b 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/medialist/MediaListViewModel.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/medialist/MediaListViewModel.kt @@ -33,7 +33,6 @@ class MediaListViewModel @AssistedInject constructor( settingRepository: SettingRepository, @Assisted private val savedStateHandle: SavedStateHandle, ) : ViewModel() { - @AssistedFactory interface Factory : ViewModelAssistedFactory diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/search/SearchScreen.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/search/SearchScreen.kt index 04eafda..fffbb9a 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/search/SearchScreen.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/search/SearchScreen.kt @@ -262,7 +262,7 @@ private fun SearchScreen( initialScale = 0.92f, animationSpec = tween(220, delayMillis = 120) ) - ) + ) .togetherWith(fadeOut(animationSpec = tween(120))) } ) { type -> @@ -276,7 +276,6 @@ private fun SearchScreen( horizontalArrangement = Arrangement.spacedBy(8.dp), contentPadding = PaddingValues( top = 16.dp, - /* The padding of the bottomBar, can't use Scaffold to add bottomBar with animation. diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/search/SearchViewModel.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/search/SearchViewModel.kt index 2eba8ae..d934fee 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/search/SearchViewModel.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/search/SearchViewModel.kt @@ -31,7 +31,6 @@ class SearchViewModel @Inject constructor( private val mediaRepository: MediaRepository, settingRepository: SettingRepository, ) : ViewModel() { - private val _searchQuery = MutableStateFlow("") val searchQuery: StateFlow = _searchQuery.asStateFlow() diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/SettingsScreen.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/SettingsScreen.kt index 52c90b9..2d49644 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/SettingsScreen.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/SettingsScreen.kt @@ -33,9 +33,7 @@ import ir.thatsmejavad.backgroundable.core.composeMail import ir.thatsmejavad.backgroundable.core.openUrl @Composable -fun SettingsScreen( - navigateTo: (String) -> Unit, -) { +fun SettingsScreen(navigateTo: (String) -> Unit) { val context = LocalContext.current BackgroundableScaffold( diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/imagequalitysetting/ImageQualitySettingViewModel.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/imagequalitysetting/ImageQualitySettingViewModel.kt index 146c0b9..d49208d 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/imagequalitysetting/ImageQualitySettingViewModel.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/imagequalitysetting/ImageQualitySettingViewModel.kt @@ -14,7 +14,6 @@ import javax.inject.Inject class ImageQualitySettingViewModel @Inject constructor( private val settingRepository: SettingRepository, ) : ViewModel() { - val imageQuality = settingRepository.userPreferencesFlow .map { it.imageQuality } .stateIn( diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/language/LanguageScreen.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/language/LanguageScreen.kt index 3490633..755f528 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/language/LanguageScreen.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/language/LanguageScreen.kt @@ -34,18 +34,14 @@ import ir.thatsmejavad.backgroundable.R import ir.thatsmejavad.backgroundable.common.ui.BackgroundableScaffold @Composable -fun LanguageScreen( - navController: NavController, -) { +fun LanguageScreen(navController: NavController) { LanguageScreen( onBackClicked = { navController.navigateUp() }, ) } @Composable -private fun LanguageScreen( - onBackClicked: () -> Unit, -) { +private fun LanguageScreen(onBackClicked: () -> Unit) { val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState()) val isPersianSelected = remember { diff --git a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/themesetting/ThemeSettingViewModel.kt b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/themesetting/ThemeSettingViewModel.kt index b3d7307..d62b718 100644 --- a/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/themesetting/ThemeSettingViewModel.kt +++ b/app/src/main/kotlin/ir/thatsmejavad/backgroundable/screens/settings/themesetting/ThemeSettingViewModel.kt @@ -14,7 +14,6 @@ import javax.inject.Inject class ThemeSettingViewModel @Inject constructor( private val settingRepository: SettingRepository, ) : ViewModel() { - val userPreferencesFlow = settingRepository.userPreferencesFlow.stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(), diff --git a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/common/CollectDataForTest.kt b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/common/CollectDataForTest.kt index 713f2cd..e79cd32 100644 --- a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/common/CollectDataForTest.kt +++ b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/common/CollectDataForTest.kt @@ -8,9 +8,23 @@ import kotlin.coroutines.CoroutineContext suspend fun PagingData.collectDataForTest(mainContext: CoroutineContext): List { val dcb = object : DifferCallback { - override fun onChanged(position: Int, count: Int) {} - override fun onInserted(position: Int, count: Int) {} - override fun onRemoved(position: Int, count: Int) {} + override fun onChanged( + position: Int, + count: Int + ) { + } + + override fun onInserted( + position: Int, + count: Int + ) { + } + + override fun onRemoved( + position: Int, + count: Int + ) { + } } val items = mutableListOf() val dif = object : PagingDataDiffer(dcb, mainContext) { diff --git a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/common/TestCoroutineExtension.kt b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/common/TestCoroutineExtension.kt index 88f4df9..4da13a7 100644 --- a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/common/TestCoroutineExtension.kt +++ b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/common/TestCoroutineExtension.kt @@ -17,11 +17,13 @@ import org.junit.jupiter.api.extension.TestInstancePostProcessor * */ @ExperimentalCoroutinesApi class TestCoroutineExtension : TestInstancePostProcessor, BeforeAllCallback, AfterAllCallback { - private val dispatcher = UnconfinedTestDispatcher() private val testScope = TestScope(dispatcher) - override fun postProcessTestInstance(testInstance: Any?, context: ExtensionContext?) { + override fun postProcessTestInstance( + testInstance: Any?, + context: ExtensionContext? + ) { (testInstance as? CoroutineTest)?.let { coroutineTest -> coroutineTest.testScope = testScope coroutineTest.dispatcher = dispatcher diff --git a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/mappers/MappersTest.kt b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/mappers/MappersTest.kt index 947d0b7..dda3c81 100644 --- a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/mappers/MappersTest.kt +++ b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/mappers/MappersTest.kt @@ -10,7 +10,6 @@ import ir.thatsmejavad.backgroundable.model.media.Resources import org.junit.jupiter.api.Test class MappersTest { - @Test fun mediaMapperTest() { val media = Media( @@ -35,7 +34,6 @@ class MappersTest { avgColor = "massa", photographerId = 3686, photographerUrl = "https://www.google.com/#q=contentiones" - ) val expected = media.toEntity(null) val actual = MediaEntity( @@ -51,7 +49,6 @@ class MappersTest { photographerId = 3686, photographerUrl = "https://www.google.com/#q=contentiones", orderId = 0 - ) expected shouldBe actual } diff --git a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/CollectionListViewModelTest.kt b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/CollectionListViewModelTest.kt index 67c52f1..eb38b92 100644 --- a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/CollectionListViewModelTest.kt +++ b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/CollectionListViewModelTest.kt @@ -25,7 +25,6 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class CollectionListViewModelTest : CoroutineTest { - override lateinit var testScope: TestScope override lateinit var dispatcher: TestDispatcher diff --git a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/DownloadPickerViewModelTest.kt b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/DownloadPickerViewModelTest.kt index 300dd55..510719c 100644 --- a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/DownloadPickerViewModelTest.kt +++ b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/DownloadPickerViewModelTest.kt @@ -28,7 +28,6 @@ import org.junit.jupiter.api.Test import java.io.IOException class DownloadPickerViewModelTest : CoroutineTest { - override lateinit var testScope: TestScope override lateinit var dispatcher: TestDispatcher diff --git a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/ImageQualitySettingViewModelTest.kt b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/ImageQualitySettingViewModelTest.kt index be86216..254e533 100644 --- a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/ImageQualitySettingViewModelTest.kt +++ b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/ImageQualitySettingViewModelTest.kt @@ -19,7 +19,6 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class ImageQualitySettingViewModelTest : CoroutineTest { - override lateinit var testScope: TestScope override lateinit var dispatcher: TestDispatcher diff --git a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/MainViewModelTest.kt b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/MainViewModelTest.kt index a54da82..aface9a 100644 --- a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/MainViewModelTest.kt +++ b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/MainViewModelTest.kt @@ -18,7 +18,6 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class MainViewModelTest : CoroutineTest { - override lateinit var testScope: TestScope override lateinit var dispatcher: TestDispatcher diff --git a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/MediaDetailViewModelTest.kt b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/MediaDetailViewModelTest.kt index 90347d4..92a7ac6 100644 --- a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/MediaDetailViewModelTest.kt +++ b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/MediaDetailViewModelTest.kt @@ -34,7 +34,6 @@ import org.junit.jupiter.api.Test import java.io.IOException class MediaDetailViewModelTest : CoroutineTest { - override lateinit var testScope: TestScope override lateinit var dispatcher: TestDispatcher diff --git a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/MediaListViewModelTest.kt b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/MediaListViewModelTest.kt index 37706ab..8d250af 100644 --- a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/MediaListViewModelTest.kt +++ b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/MediaListViewModelTest.kt @@ -31,7 +31,6 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class MediaListViewModelTest : CoroutineTest { - override lateinit var testScope: TestScope override lateinit var dispatcher: TestDispatcher diff --git a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/SearchViewModelTest.kt b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/SearchViewModelTest.kt index d083084..e89533d 100644 --- a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/SearchViewModelTest.kt +++ b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/SearchViewModelTest.kt @@ -30,7 +30,6 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class SearchViewModelTest : CoroutineTest { - override lateinit var testScope: TestScope override lateinit var dispatcher: TestDispatcher @@ -138,19 +137,18 @@ class SearchViewModelTest : CoroutineTest { } @Test - fun `searchPhoto should be called on text with chars more than 3 after 1 second debounce`() = - runTest { - val viewModel = createViewModel() - viewModel.updateSearchText("text test") - - viewModel.medias.test { - awaitItem().collectDataForTest(dispatcher) shouldBe listOf() - } + fun `searchPhoto should be called on text with chars more than 3 after 1 second debounce`() = runTest { + val viewModel = createViewModel() + viewModel.updateSearchText("text test") - advanceTimeBy(1002) - verify(exactly = 1) { mediaRepository.searchPhoto(any()) } + viewModel.medias.test { + awaitItem().collectDataForTest(dispatcher) shouldBe listOf() } + advanceTimeBy(1002) + verify(exactly = 1) { mediaRepository.searchPhoto(any()) } + } + @Test fun `medias should be update with searchPhoto`() = runTest { coEvery { mediaRepository.searchPhoto(any()) } returns flowOf( diff --git a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/ThemeSettingViewModelTest.kt b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/ThemeSettingViewModelTest.kt index fac9e28..14b01a6 100644 --- a/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/ThemeSettingViewModelTest.kt +++ b/app/src/test/kotlin/ir/thatsmejavad/backgroundable/viewmodels/ThemeSettingViewModelTest.kt @@ -21,7 +21,6 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class ThemeSettingViewModelTest : CoroutineTest { - override lateinit var testScope: TestScope override lateinit var dispatcher: TestDispatcher @@ -34,17 +33,16 @@ class ThemeSettingViewModelTest : CoroutineTest { } @Test - fun `userPreferencesFlow should be updated with data of settingRepo's userPreferencesFlow`() = - runTest { - every { settingRepository.userPreferencesFlow } returns flowOf(UserPreferences()) - val viewModel = createViewModel() + fun `userPreferencesFlow should be updated with data of settingRepo's userPreferencesFlow`() = runTest { + every { settingRepository.userPreferencesFlow } returns flowOf(UserPreferences()) + val viewModel = createViewModel() - verify(exactly = 1) { settingRepository.userPreferencesFlow } + verify(exactly = 1) { settingRepository.userPreferencesFlow } - viewModel.userPreferencesFlow.test { - awaitItem() shouldBe UserPreferences() - } + viewModel.userPreferencesFlow.test { + awaitItem() shouldBe UserPreferences() } + } @Test fun `repo's setThemeMode should call when updateTheme called`() { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dae19ca..819d235 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -27,6 +27,8 @@ kotlin = "1.9.22" kotlinxSerialization = "1.6.3" kover = "0.7.4" ksp = "1.9.22-1.0.17" +ktlint = "1.2.1" +ktlintGradle = "12.1.0" lifecycleRuntime = "2.7.0" material3 = "1.2.1" mockK = "1.13.10" @@ -68,7 +70,6 @@ dagger = { module = "com.google.dagger:dagger", version.ref = "dagger" } daggerCompiler = { module = "com.google.dagger:dagger-compiler", version.ref = "dagger" } datastore = { module = "androidx.datastore:datastore", version.ref = "datastore" } datastorePreferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastore" } -detektFormatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" } espressoCore = { module = "androidx.test.espresso:espresso-core", version.ref = "espressoCore" } junitJupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } kotestAssertion = { module = "io.kotest:kotest-assertions-core", version.ref = "kotestAssertion" } @@ -100,6 +101,7 @@ kotlin = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlintGradle" } protobuf = { id = "com.google.protobuf", version.ref = "protobuf" } [bundles]