From f928c5d75d9e972556d9032cb6cd342711ad9492 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 26 Mar 2025 16:28:19 +0300 Subject: [PATCH 1/2] hw_1 --- .editorconfig | 8 ++++ .../androidmovie/ExampleInstrumentedTest.kt | 24 ---------- .../example/androidmovie/ExampleUnitTest.kt | 17 ------- build.gradle | 48 ++++++++++++++++++- .../example/common/ExampleInstrumentedTest.kt | 24 ---------- .../com/example/common/ExampleUnitTest.kt | 17 ------- .../core/dagger/ExampleInstrumentedTest.kt | 24 ---------- .../example/core/dagger/ExampleUnitTest.kt | 17 ------- .../dependency/ExampleInstrumentedTest.kt | 24 ---------- .../core/dependency/ExampleUnitTest.kt | 17 ------- .../navigation/ExampleInstrumentedTest.kt | 24 ---------- .../core/navigation/ExampleUnitTest.kt | 17 ------- .../uicomponent/ExampleInstrumentedTest.kt | 24 ---------- .../core/uicomponent/ExampleUnitTest.kt | 17 ------- .../example/data/ExampleInstrumentedTest.kt | 24 ---------- .../java/com/example/data/ExampleUnitTest.kt | 17 ------- .../example/domain/ExampleInstrumentedTest.kt | 24 ---------- .../com/example/domain/ExampleUnitTest.kt | 17 ------- .../domain/ExampleInstrumentedTest.kt | 24 ---------- .../popularmovies/domain/ExampleUnitTest.kt | 17 ------- .../presentation/ExampleInstrumentedTest.kt | 24 ---------- .../presentation/ExampleUnitTest.kt | 17 ------- ktlint.gradle | 32 +++++++++++++ .../network/ExampleInstrumentedTest.kt | 24 ---------- .../network/network/ExampleUnitTest.kt | 17 ------- .../network/utils/ExampleInstrumentedTest.kt | 24 ---------- .../example/network/utils/ExampleUnitTest.kt | 17 ------- 27 files changed, 86 insertions(+), 494 deletions(-) create mode 100644 .editorconfig delete mode 100644 app/src/androidTest/java/com/example/androidmovie/ExampleInstrumentedTest.kt delete mode 100644 app/src/test/java/com/example/androidmovie/ExampleUnitTest.kt delete mode 100644 common/src/androidTest/java/com/example/common/ExampleInstrumentedTest.kt delete mode 100644 common/src/test/java/com/example/common/ExampleUnitTest.kt delete mode 100644 core/dagger/src/androidTest/java/com/example/core/dagger/ExampleInstrumentedTest.kt delete mode 100644 core/dagger/src/test/java/com/example/core/dagger/ExampleUnitTest.kt delete mode 100644 core/dependency/src/androidTest/java/com/example/core/dependency/ExampleInstrumentedTest.kt delete mode 100644 core/dependency/src/test/java/com/example/core/dependency/ExampleUnitTest.kt delete mode 100644 core/navigation/src/androidTest/java/com/example/core/navigation/ExampleInstrumentedTest.kt delete mode 100644 core/navigation/src/test/java/com/example/core/navigation/ExampleUnitTest.kt delete mode 100644 core/uiComponent/src/androidTest/java/com/example/core/uicomponent/ExampleInstrumentedTest.kt delete mode 100644 core/uiComponent/src/test/java/com/example/core/uicomponent/ExampleUnitTest.kt delete mode 100644 data/src/androidTest/java/com/example/data/ExampleInstrumentedTest.kt delete mode 100644 data/src/test/java/com/example/data/ExampleUnitTest.kt delete mode 100644 domain/src/androidTest/java/com/example/domain/ExampleInstrumentedTest.kt delete mode 100644 domain/src/test/java/com/example/domain/ExampleUnitTest.kt delete mode 100644 features/popularmovies/domain/src/androidTest/java/com/example/popularmovies/domain/ExampleInstrumentedTest.kt delete mode 100644 features/popularmovies/domain/src/test/java/com/example/popularmovies/domain/ExampleUnitTest.kt delete mode 100644 features/popularmovies/presentation/src/androidTest/java/com/example/popularmovies/presentation/ExampleInstrumentedTest.kt delete mode 100644 features/popularmovies/presentation/src/test/java/com/example/popularmovies/presentation/ExampleUnitTest.kt create mode 100644 ktlint.gradle delete mode 100644 network/network/src/androidTest/java/com/example/network/network/ExampleInstrumentedTest.kt delete mode 100644 network/network/src/test/java/com/example/network/network/ExampleUnitTest.kt delete mode 100644 network/utils/src/androidTest/java/com/example/network/utils/ExampleInstrumentedTest.kt delete mode 100644 network/utils/src/test/java/com/example/network/utils/ExampleUnitTest.kt diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..65160ed --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*.{kt,kts}] +indent_size = 4 +max_line_length = 120 +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 diff --git a/app/src/androidTest/java/com/example/androidmovie/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/androidmovie/ExampleInstrumentedTest.kt deleted file mode 100644 index d9f2aa7..0000000 --- a/app/src/androidTest/java/com/example/androidmovie/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.androidmovie - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.androidmovie", appContext.packageName) - } -} \ No newline at end of file diff --git a/app/src/test/java/com/example/androidmovie/ExampleUnitTest.kt b/app/src/test/java/com/example/androidmovie/ExampleUnitTest.kt deleted file mode 100644 index bc3d783..0000000 --- a/app/src/test/java/com/example/androidmovie/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.androidmovie - -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/build.gradle b/build.gradle index 818510a..4bc50ec 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,51 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '8.0.2' apply false - id 'com.android.library' version '8.0.2' apply false + id 'com.android.application' version '8.8.0' apply false + id 'com.android.library' version '8.8.0' apply false id 'org.jetbrains.kotlin.android' version '1.8.20' apply false id 'androidx.navigation.safeargs.kotlin' version '2.5.0' apply false + id 'io.gitlab.arturbosch.detekt' version '1.23.8' apply false +} + +apply from: "ktlint.gradle" + +subprojects { + apply plugin: "io.gitlab.arturbosch.detekt" + + detekt { + toolVersion = "1.23.8" + config.setFrom(file("$rootDir/config/detekt/detekt.yml")) + buildUponDefaultConfig = true + reports { + html.enabled = true + xml.enabled = false + txt.enabled = false + } + } +} + +tasks.register("detektAll") { + group = "verification" + description = "Run detekt for all modules and generate a single report." + + dependsOn subprojects.collect { it.tasks.findByName("detekt") } + + doLast { + def outputDir = file("$buildDir/reports/detekt") + outputDir.mkdirs() + + def mergedReport = new File(outputDir, "detekt-all-report.html") + mergedReport.write("") // Очищаем файл перед записью + + subprojects.each { project -> + def reportFile = project.file("${project.buildDir}/reports/detekt/detekt.html") + if (reportFile.exists()) { + mergedReport.append("\n") + mergedReport.append(reportFile.text) + mergedReport.append("\n") + } else { + println "Report not found for module: ${project.name}" + } + } + } } \ No newline at end of file diff --git a/common/src/androidTest/java/com/example/common/ExampleInstrumentedTest.kt b/common/src/androidTest/java/com/example/common/ExampleInstrumentedTest.kt deleted file mode 100644 index 0886bf6..0000000 --- a/common/src/androidTest/java/com/example/common/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.common - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.common.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/common/src/test/java/com/example/common/ExampleUnitTest.kt b/common/src/test/java/com/example/common/ExampleUnitTest.kt deleted file mode 100644 index 6c9f3e0..0000000 --- a/common/src/test/java/com/example/common/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.common - -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/core/dagger/src/androidTest/java/com/example/core/dagger/ExampleInstrumentedTest.kt b/core/dagger/src/androidTest/java/com/example/core/dagger/ExampleInstrumentedTest.kt deleted file mode 100644 index 82d404c..0000000 --- a/core/dagger/src/androidTest/java/com/example/core/dagger/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.core.dagger - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.core.dagger.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/core/dagger/src/test/java/com/example/core/dagger/ExampleUnitTest.kt b/core/dagger/src/test/java/com/example/core/dagger/ExampleUnitTest.kt deleted file mode 100644 index 732bc54..0000000 --- a/core/dagger/src/test/java/com/example/core/dagger/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.core.dagger - -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/core/dependency/src/androidTest/java/com/example/core/dependency/ExampleInstrumentedTest.kt b/core/dependency/src/androidTest/java/com/example/core/dependency/ExampleInstrumentedTest.kt deleted file mode 100644 index fe70f1f..0000000 --- a/core/dependency/src/androidTest/java/com/example/core/dependency/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.core.dependency - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.core.dependency.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/core/dependency/src/test/java/com/example/core/dependency/ExampleUnitTest.kt b/core/dependency/src/test/java/com/example/core/dependency/ExampleUnitTest.kt deleted file mode 100644 index cbc7d0a..0000000 --- a/core/dependency/src/test/java/com/example/core/dependency/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.core.dependency - -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/core/navigation/src/androidTest/java/com/example/core/navigation/ExampleInstrumentedTest.kt b/core/navigation/src/androidTest/java/com/example/core/navigation/ExampleInstrumentedTest.kt deleted file mode 100644 index 33422c8..0000000 --- a/core/navigation/src/androidTest/java/com/example/core/navigation/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.core.navigation - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.core.navigation.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/core/navigation/src/test/java/com/example/core/navigation/ExampleUnitTest.kt b/core/navigation/src/test/java/com/example/core/navigation/ExampleUnitTest.kt deleted file mode 100644 index d59fdb9..0000000 --- a/core/navigation/src/test/java/com/example/core/navigation/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.core.navigation - -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/core/uiComponent/src/androidTest/java/com/example/core/uicomponent/ExampleInstrumentedTest.kt b/core/uiComponent/src/androidTest/java/com/example/core/uicomponent/ExampleInstrumentedTest.kt deleted file mode 100644 index 66f4bb6..0000000 --- a/core/uiComponent/src/androidTest/java/com/example/core/uicomponent/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.core.uicomponent - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.core.uicomponent.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/core/uiComponent/src/test/java/com/example/core/uicomponent/ExampleUnitTest.kt b/core/uiComponent/src/test/java/com/example/core/uicomponent/ExampleUnitTest.kt deleted file mode 100644 index 31626ec..0000000 --- a/core/uiComponent/src/test/java/com/example/core/uicomponent/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.core.uicomponent - -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/data/src/androidTest/java/com/example/data/ExampleInstrumentedTest.kt b/data/src/androidTest/java/com/example/data/ExampleInstrumentedTest.kt deleted file mode 100644 index 1ea0a20..0000000 --- a/data/src/androidTest/java/com/example/data/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.data - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.data.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/data/src/test/java/com/example/data/ExampleUnitTest.kt b/data/src/test/java/com/example/data/ExampleUnitTest.kt deleted file mode 100644 index 8943744..0000000 --- a/data/src/test/java/com/example/data/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.data - -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/androidTest/java/com/example/domain/ExampleInstrumentedTest.kt b/domain/src/androidTest/java/com/example/domain/ExampleInstrumentedTest.kt deleted file mode 100644 index 76419f2..0000000 --- a/domain/src/androidTest/java/com/example/domain/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.domain - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.domain.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/domain/src/test/java/com/example/domain/ExampleUnitTest.kt b/domain/src/test/java/com/example/domain/ExampleUnitTest.kt deleted file mode 100644 index cd437eb..0000000 --- a/domain/src/test/java/com/example/domain/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.domain - -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/features/popularmovies/domain/src/androidTest/java/com/example/popularmovies/domain/ExampleInstrumentedTest.kt b/features/popularmovies/domain/src/androidTest/java/com/example/popularmovies/domain/ExampleInstrumentedTest.kt deleted file mode 100644 index 0e4a303..0000000 --- a/features/popularmovies/domain/src/androidTest/java/com/example/popularmovies/domain/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.popularmovies.domain - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.popularmovies.domain.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/features/popularmovies/domain/src/test/java/com/example/popularmovies/domain/ExampleUnitTest.kt b/features/popularmovies/domain/src/test/java/com/example/popularmovies/domain/ExampleUnitTest.kt deleted file mode 100644 index cdf13c6..0000000 --- a/features/popularmovies/domain/src/test/java/com/example/popularmovies/domain/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.popularmovies.domain - -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/features/popularmovies/presentation/src/androidTest/java/com/example/popularmovies/presentation/ExampleInstrumentedTest.kt b/features/popularmovies/presentation/src/androidTest/java/com/example/popularmovies/presentation/ExampleInstrumentedTest.kt deleted file mode 100644 index b1136a8..0000000 --- a/features/popularmovies/presentation/src/androidTest/java/com/example/popularmovies/presentation/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.popularmovies.presentation - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.popularmovies.presentation.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/features/popularmovies/presentation/src/test/java/com/example/popularmovies/presentation/ExampleUnitTest.kt b/features/popularmovies/presentation/src/test/java/com/example/popularmovies/presentation/ExampleUnitTest.kt deleted file mode 100644 index 914853b..0000000 --- a/features/popularmovies/presentation/src/test/java/com/example/popularmovies/presentation/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.popularmovies.presentation - -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/ktlint.gradle b/ktlint.gradle new file mode 100644 index 0000000..0111f69 --- /dev/null +++ b/ktlint.gradle @@ -0,0 +1,32 @@ +configurations { + ktlint +} + +dependencies { + ktlint("com.pinterest.ktlint:ktlint-cli:1.5.0") { + attributes { + attribute(Bundling.BUNDLING_ATTRIBUTE, getObjects().named(Bundling, Bundling.EXTERNAL)) + } + } +} + +tasks.register("ktlintCheck", JavaExec) { + group = "verification" + description = "Check Kotlin code style." + classpath = configurations.ktlint + mainClass = "com.pinterest.ktlint.Main" + args = ["--reporter=plain", + "--reporter=checkstyle,output=${project.buildDir}/reports/ktlint/ktlint-checkstyle-report.xml", + "**src/**/*.kt", + "**.kts", + "!**/build/**"] +} + +tasks.register("ktlintFormat", JavaExec) { + group = "formatting" + description = "Fix Kotlin code style deviations." + classpath = configurations.ktlint + mainClass = "com.pinterest.ktlint.Main" + jvmArgs "--add-opens=java.base/java.lang=ALL-UNNAMED" + args "-F", "src/**/*.kt", "**.kts", "!**/build/**" +} \ No newline at end of file diff --git a/network/network/src/androidTest/java/com/example/network/network/ExampleInstrumentedTest.kt b/network/network/src/androidTest/java/com/example/network/network/ExampleInstrumentedTest.kt deleted file mode 100644 index 1ee9feb..0000000 --- a/network/network/src/androidTest/java/com/example/network/network/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.network.network - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.network.network.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/network/network/src/test/java/com/example/network/network/ExampleUnitTest.kt b/network/network/src/test/java/com/example/network/network/ExampleUnitTest.kt deleted file mode 100644 index 4699afc..0000000 --- a/network/network/src/test/java/com/example/network/network/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.network.network - -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/network/utils/src/androidTest/java/com/example/network/utils/ExampleInstrumentedTest.kt b/network/utils/src/androidTest/java/com/example/network/utils/ExampleInstrumentedTest.kt deleted file mode 100644 index f09cb19..0000000 --- a/network/utils/src/androidTest/java/com/example/network/utils/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.network.utils - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.network.utils.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/network/utils/src/test/java/com/example/network/utils/ExampleUnitTest.kt b/network/utils/src/test/java/com/example/network/utils/ExampleUnitTest.kt deleted file mode 100644 index 1174e8b..0000000 --- a/network/utils/src/test/java/com/example/network/utils/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.network.utils - -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 From f1856f13b4e1d5dec274156a1d9528754fe16309 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 26 Mar 2025 16:38:58 +0300 Subject: [PATCH 2/2] hw_1 done --- .../main/java/com/example/androidmovie/App.kt | 12 +-- .../com/example/androidmovie/MainActivity.kt | 10 +-- .../example/androidmovie/di/AppComponent.kt | 10 +-- .../MovieDepsModule.kt | 4 +- .../PopularMoviesDepsModule.kt | 2 +- .../androidmovie/di/modules/DataModule.kt | 20 +++-- .../androidmovie/di/modules/DomainModule.kt | 9 +-- .../di/modules/FeatureDepsModule.kt | 8 +- .../androidmovie/di/modules/NetworkModule.kt | 15 ++-- .../main/java/com/example/common/Entity.kt | 24 +++--- .../com/example/core/dagger/Annotations.kt | 4 +- .../core/dependency/FragmentExtensions.kt | 77 +++++++++---------- .../example/core/navigation/NavigationFlow.kt | 7 +- .../com/example/core/navigation/Navigator.kt | 22 +++--- .../core/uicomponent/base/BaseFragment.kt | 15 ++-- .../main/java/com/example/data/DataConst.kt | 2 +- .../com/example/data/base/BaseRepository.kt | 56 ++++++++------ .../com/example/data/mapper/MovieMapper.kt | 7 +- .../data/mapper/PopularMoviesMapper.kt | 14 ++-- .../ApiProvider.kt | 8 +- .../data/repositories/MovieRepositoryImpl.kt | 30 ++++---- .../PopularMoviesRepositoryImpl.kt | 28 +++---- .../com/example/domain/MovieInteractorImpl.kt | 9 +-- .../domain/PopularMoviesInteractorImpl.kt | 9 +-- .../com/example/movie/domain/MovieEntity.kt | 6 +- .../example/movie/domain/MovieInteractor.kt | 4 +- .../example/movie/domain/MovieRepository.kt | 4 +- .../movie/presentation/di/MovieComponent.kt | 9 ++- .../presentation/ui/MovieExecutorImpl.kt | 4 +- .../movie/presentation/ui/MovieFragment.kt | 24 +++--- .../movie/presentation/ui/MovieReducer.kt | 14 +++- .../movie/presentation/ui/MovieStore.kt | 12 ++- .../presentation/ui/MovieStoreFactory.kt | 20 ++--- .../domain/PopularMoviesEntity.kt | 4 +- .../domain/PopularMoviesInteractor.kt | 4 +- .../domain/PopularMoviesRepository.kt | 4 +- .../presentation/di/PopularMoviesComponent.kt | 7 +- .../presentation/ui/MovieModel.kt | 4 +- .../ui/PopularMoviesExecutorImpl.kt | 25 +++--- .../presentation/ui/PopularMoviesFragment.kt | 17 ++-- .../presentation/ui/PopularMoviesReducer.kt | 14 +++- .../presentation/ui/PopularMoviesStore.kt | 5 +- .../ui/PopularMoviesStoreFactory.kt | 22 +++--- .../ui/adapter/MoviesPagingSource.kt | 32 ++++---- .../ui/adapter/PopularMoviesAdapter.kt | 53 +++++++------ .../network/dto/response/MovieResponse.kt | 4 +- .../dto/response/PopularMoviesResponse.kt | 4 +- .../network/provider/NetworkProvider.kt | 36 +++++---- .../utils/exceptions/NetworkException.kt | 2 +- .../com/example/network/utils/models/Error.kt | 2 +- .../network/utils/models/ResponseStatus.kt | 35 ++++----- .../network/utils/models/ServerResponse.kt | 2 +- 52 files changed, 408 insertions(+), 367 deletions(-) rename app/src/main/java/com/example/androidmovie/di/{feature_deps => featureDeps}/MovieDepsModule.kt (89%) rename app/src/main/java/com/example/androidmovie/di/{feature_deps => featureDeps}/PopularMoviesDepsModule.kt (90%) rename data/src/main/java/com/example/data/{movies_api_provider => moviesApiProvider}/ApiProvider.kt (65%) diff --git a/app/src/main/java/com/example/androidmovie/App.kt b/app/src/main/java/com/example/androidmovie/App.kt index e0daeb6..65d08db 100644 --- a/app/src/main/java/com/example/androidmovie/App.kt +++ b/app/src/main/java/com/example/androidmovie/App.kt @@ -8,17 +8,19 @@ import com.example.core.dependency.DepsMap import com.example.core.dependency.HasDependencies import javax.inject.Inject -class App : Application(), HasDependencies { - +class App : + Application(), + HasDependencies { @Inject override lateinit var depsMap: DepsMap override fun onCreate() { super.onCreate() - DaggerAppComponent.builder() + DaggerAppComponent + .builder() .application(this) .connectivityManager(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager) - .build(). - inject(this) + .build() + .inject(this) } } diff --git a/app/src/main/java/com/example/androidmovie/MainActivity.kt b/app/src/main/java/com/example/androidmovie/MainActivity.kt index 2f38d3d..adb44dc 100644 --- a/app/src/main/java/com/example/androidmovie/MainActivity.kt +++ b/app/src/main/java/com/example/androidmovie/MainActivity.kt @@ -1,16 +1,16 @@ package com.example.androidmovie -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment import com.example.core.navigation.NavigationFlow import com.example.core.navigation.Navigator -import com.example.core.navigation.ToFlowNavigatable import com.example.core.navigation.R.navigation.main_nav_graph +import com.example.core.navigation.ToFlowNavigatable - -class MainActivity : AppCompatActivity(R.layout.activity_main), ToFlowNavigatable { - +class MainActivity : + AppCompatActivity(R.layout.activity_main), + ToFlowNavigatable { private val navigator: Navigator = Navigator() override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/example/androidmovie/di/AppComponent.kt b/app/src/main/java/com/example/androidmovie/di/AppComponent.kt index b8502b0..1b2bf01 100644 --- a/app/src/main/java/com/example/androidmovie/di/AppComponent.kt +++ b/app/src/main/java/com/example/androidmovie/di/AppComponent.kt @@ -22,15 +22,13 @@ annotation class AppScope modules = [ AppModule::class, DomainModule::class, - FeatureDepsModule::class - ] + FeatureDepsModule::class, + ], ) - @AppScope interface AppComponent : PopularMoviesDeps, MovieDeps { - @Component.Builder interface Builder { @BindsInstance @@ -49,7 +47,5 @@ interface AppComponent : class AppModule { @AppScope @Provides - fun provideContext( - application: Application - ): Context = application.applicationContext + fun provideContext(application: Application): Context = application.applicationContext } diff --git a/app/src/main/java/com/example/androidmovie/di/feature_deps/MovieDepsModule.kt b/app/src/main/java/com/example/androidmovie/di/featureDeps/MovieDepsModule.kt similarity index 89% rename from app/src/main/java/com/example/androidmovie/di/feature_deps/MovieDepsModule.kt rename to app/src/main/java/com/example/androidmovie/di/featureDeps/MovieDepsModule.kt index 5bac75b..518e881 100644 --- a/app/src/main/java/com/example/androidmovie/di/feature_deps/MovieDepsModule.kt +++ b/app/src/main/java/com/example/androidmovie/di/featureDeps/MovieDepsModule.kt @@ -1,4 +1,4 @@ -package com.example.androidmovie.di.feature_deps +package com.example.androidmovie.di.featureDeps import com.example.androidmovie.di.AppComponent import com.example.core.dagger.DependenciesKey @@ -14,4 +14,4 @@ interface MovieDepsModule { @IntoMap @DependenciesKey(MovieDeps::class) fun bindMovieDeps(impl: AppComponent): Dependencies -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/androidmovie/di/feature_deps/PopularMoviesDepsModule.kt b/app/src/main/java/com/example/androidmovie/di/featureDeps/PopularMoviesDepsModule.kt similarity index 90% rename from app/src/main/java/com/example/androidmovie/di/feature_deps/PopularMoviesDepsModule.kt rename to app/src/main/java/com/example/androidmovie/di/featureDeps/PopularMoviesDepsModule.kt index 079f01b..6113cb0 100644 --- a/app/src/main/java/com/example/androidmovie/di/feature_deps/PopularMoviesDepsModule.kt +++ b/app/src/main/java/com/example/androidmovie/di/featureDeps/PopularMoviesDepsModule.kt @@ -1,4 +1,4 @@ -package com.example.androidmovie.di.feature_deps +package com.example.androidmovie.di.featureDeps import com.example.androidmovie.di.AppComponent import com.example.core.dagger.DependenciesKey diff --git a/app/src/main/java/com/example/androidmovie/di/modules/DataModule.kt b/app/src/main/java/com/example/androidmovie/di/modules/DataModule.kt index 2080d8e..fd3e2db 100644 --- a/app/src/main/java/com/example/androidmovie/di/modules/DataModule.kt +++ b/app/src/main/java/com/example/androidmovie/di/modules/DataModule.kt @@ -11,16 +11,14 @@ import dagger.Provides @Module(includes = [NetworkModule::class]) class DataModule { @Provides - fun providePopularMoviesRepository( - api: Api - ) : PopularMoviesRepository = PopularMoviesRepositoryImpl( - api - ) + fun providePopularMoviesRepository(api: Api): PopularMoviesRepository = + PopularMoviesRepositoryImpl( + api, + ) @Provides - fun provideMovieRepository( - api: Api - ) : MovieRepository = MovieRepositoryImpl( - api - ) -} \ No newline at end of file + fun provideMovieRepository(api: Api): MovieRepository = + MovieRepositoryImpl( + api, + ) +} diff --git a/app/src/main/java/com/example/androidmovie/di/modules/DomainModule.kt b/app/src/main/java/com/example/androidmovie/di/modules/DomainModule.kt index 9c51b72..63d6ac5 100644 --- a/app/src/main/java/com/example/androidmovie/di/modules/DomainModule.kt +++ b/app/src/main/java/com/example/androidmovie/di/modules/DomainModule.kt @@ -12,12 +12,9 @@ import dagger.Provides @Module(includes = [DataModule::class]) class DomainModule { @Provides - fun providePopularMoviesInteractor( - popularMoviesRepository: PopularMoviesRepository - ): PopularMoviesInteractor = PopularMoviesInteractorImpl(popularMoviesRepository) + fun providePopularMoviesInteractor(popularMoviesRepository: PopularMoviesRepository): PopularMoviesInteractor = + PopularMoviesInteractorImpl(popularMoviesRepository) @Provides - fun provideMovieInteractor( - movieRepository: MovieRepository - ): MovieInteractor = MovieInteractorImpl(movieRepository) + fun provideMovieInteractor(movieRepository: MovieRepository): MovieInteractor = MovieInteractorImpl(movieRepository) } diff --git a/app/src/main/java/com/example/androidmovie/di/modules/FeatureDepsModule.kt b/app/src/main/java/com/example/androidmovie/di/modules/FeatureDepsModule.kt index b533baa..e7597e5 100644 --- a/app/src/main/java/com/example/androidmovie/di/modules/FeatureDepsModule.kt +++ b/app/src/main/java/com/example/androidmovie/di/modules/FeatureDepsModule.kt @@ -1,13 +1,13 @@ package com.example.androidmovie.di.modules -import com.example.androidmovie.di.feature_deps.MovieDepsModule -import com.example.androidmovie.di.feature_deps.PopularMoviesDepsModule +import com.example.androidmovie.di.featureDeps.MovieDepsModule +import com.example.androidmovie.di.featureDeps.PopularMoviesDepsModule import dagger.Module @Module( includes = [ PopularMoviesDepsModule::class, - MovieDepsModule::class - ] + MovieDepsModule::class, + ], ) interface FeatureDepsModule diff --git a/app/src/main/java/com/example/androidmovie/di/modules/NetworkModule.kt b/app/src/main/java/com/example/androidmovie/di/modules/NetworkModule.kt index b03b779..860c476 100644 --- a/app/src/main/java/com/example/androidmovie/di/modules/NetworkModule.kt +++ b/app/src/main/java/com/example/androidmovie/di/modules/NetworkModule.kt @@ -1,7 +1,7 @@ package com.example.androidmovie.di.modules import android.net.ConnectivityManager -import com.example.data.movies_api_provider.ApiProvider +import com.example.data.moviesApiProvider.ApiProvider import com.example.network.network.ApiConst import com.example.network.network.api.Api import com.example.network.network.provider.NetworkProvider @@ -11,17 +11,12 @@ import dagger.Provides @Module class NetworkModule { @Provides - fun provideNetworkProvider( - connectivityManager: ConnectivityManager - ): NetworkProvider = NetworkProvider(connectivityManager) + fun provideNetworkProvider(connectivityManager: ConnectivityManager): NetworkProvider = + NetworkProvider(connectivityManager) @Provides - fun provideApiProvider( - networkProvider: NetworkProvider - ): ApiProvider = ApiProvider(networkProvider) + fun provideApiProvider(networkProvider: NetworkProvider): ApiProvider = ApiProvider(networkProvider) @Provides - fun provideApi( - provider: ApiProvider - ) : Api = provider.provideNetwork(baseUrl = ApiConst.HOST_API) + fun provideApi(provider: ApiProvider): Api = provider.provideNetwork(baseUrl = ApiConst.HOST_API) } diff --git a/common/src/main/java/com/example/common/Entity.kt b/common/src/main/java/com/example/common/Entity.kt index 2faed25..39af91b 100644 --- a/common/src/main/java/com/example/common/Entity.kt +++ b/common/src/main/java/com/example/common/Entity.kt @@ -1,16 +1,20 @@ package com.example.common -sealed class Entity{ - data class Success(val data: T?, val code: Int? = null) : Entity() { - override fun map(mapper: (oldValue: T?) -> K?): Success { - return Success(mapper.invoke(data), code) - } +sealed class Entity { + data class Success( + val data: T?, + val code: Int? = null, + ) : Entity() { + override fun map(mapper: (oldValue: T?) -> K?): Success = Success(mapper.invoke(data), code) } - data class Error(val exceptionMessage: String, val localData: T? = null) : - Entity() { - override fun map(mapper: (oldValue: T?) -> K?): Error { - return Error(exceptionMessage, mapper.invoke(localData)) - } + + data class Error( + val exceptionMessage: String, + val localData: T? = null, + ) : Entity() { + override fun map(mapper: (oldValue: T?) -> K?): Error = + Error(exceptionMessage, mapper.invoke(localData)) } + abstract fun map(mapper: (oldValue: T?) -> K?): Entity } diff --git a/core/dagger/src/main/java/com/example/core/dagger/Annotations.kt b/core/dagger/src/main/java/com/example/core/dagger/Annotations.kt index 6773ac3..9d5f294 100644 --- a/core/dagger/src/main/java/com/example/core/dagger/Annotations.kt +++ b/core/dagger/src/main/java/com/example/core/dagger/Annotations.kt @@ -6,7 +6,9 @@ import javax.inject.Scope import kotlin.reflect.KClass @MapKey -annotation class DependenciesKey(val value: KClass) +annotation class DependenciesKey( + val value: KClass, +) @Scope @Retention(AnnotationRetention.RUNTIME) diff --git a/core/dependency/src/main/java/com/example/core/dependency/FragmentExtensions.kt b/core/dependency/src/main/java/com/example/core/dependency/FragmentExtensions.kt index 7baa61f..01a35bc 100644 --- a/core/dependency/src/main/java/com/example/core/dependency/FragmentExtensions.kt +++ b/core/dependency/src/main/java/com/example/core/dependency/FragmentExtensions.kt @@ -4,59 +4,56 @@ import android.app.Activity import android.app.Application import androidx.fragment.app.Fragment -inline fun Fragment.findDependencies(): D { - return findDependenciesByClass(D::class.java) -} +inline fun Fragment.findDependencies(): D = findDependenciesByClass(D::class.java) @Suppress("UNCHECKED_CAST") -fun Fragment.findDependenciesByClass(clazz: Class): D { - return parents.firstNotNullOfOrNull { it.depsMap[clazz] } as D? +fun Fragment.findDependenciesByClass(clazz: Class): D = + parents.firstNotNullOfOrNull { it.depsMap[clazz] } as D? ?: throw IllegalStateException("No Dependencies $clazz in ${allParents.joinToString()}") -} internal val Fragment.parents: Iterable get() = allParents.mapNotNull { it as? HasDependencies } internal val Fragment.allParents: Iterable - get() = object : Iterable { - override fun iterator() = object : Iterator { - private var currentParentFragment: Fragment? = parentFragment - private var parentActivity: Activity? = activity - private var parentApplication: Application? = parentActivity?.application - - override fun hasNext() = - currentParentFragment != null || parentActivity != null || parentApplication != null - - override fun next(): Any { - currentParentFragment?.let { parent -> - currentParentFragment = parent.parentFragment - return parent + get() = + object : Iterable { + override fun iterator() = + object : Iterator { + private var currentParentFragment: Fragment? = parentFragment + private var parentActivity: Activity? = activity + private var parentApplication: Application? = parentActivity?.application + + override fun hasNext() = + currentParentFragment != null || parentActivity != null || parentApplication != null + + override fun next(): Any { + currentParentFragment?.let { parent -> + currentParentFragment = parent.parentFragment + return parent + } + + parentActivity?.let { parent -> + parentActivity = null + return parent + } + + parentApplication?.let { parent -> + parentApplication = null + return parent + } + + throw NoSuchElementException() + } } - - parentActivity?.let { parent -> - parentActivity = null - return parent - } - - parentApplication?.let { parent -> - parentApplication = null - return parent - } - - throw NoSuchElementException() - } } - } internal val Activity.depsApplication: HasDependencies? get() = application as? HasDependencies -//Dependencies -inline fun Activity.findDependencies(): D { - return findDependenciesByClass(D::class.java) -} +// Dependencies +inline fun Activity.findDependencies(): D = findDependenciesByClass(D::class.java) @Suppress("UNCHECKED_CAST") -fun Activity.findDependenciesByClass(clazz: Class): D { - return depsApplication?.depsMap?.get(clazz) as? D ?: throw IllegalStateException("No Dependencies $clazz in application") -} +fun Activity.findDependenciesByClass(clazz: Class): D = + depsApplication?.depsMap?.get(clazz) as? D + ?: throw IllegalStateException("No Dependencies $clazz in application") diff --git a/core/navigation/src/main/java/com/example/core/navigation/NavigationFlow.kt b/core/navigation/src/main/java/com/example/core/navigation/NavigationFlow.kt index 88937bd..d9d4a8c 100644 --- a/core/navigation/src/main/java/com/example/core/navigation/NavigationFlow.kt +++ b/core/navigation/src/main/java/com/example/core/navigation/NavigationFlow.kt @@ -2,5 +2,8 @@ package com.example.core.navigation sealed class NavigationFlow { object PopularMoviesFlow : NavigationFlow() - class MovieFlow(val movieId: String) : NavigationFlow() -} \ No newline at end of file + + class MovieFlow( + val movieId: String, + ) : NavigationFlow() +} diff --git a/core/navigation/src/main/java/com/example/core/navigation/Navigator.kt b/core/navigation/src/main/java/com/example/core/navigation/Navigator.kt index ab4473b..6fd44f0 100644 --- a/core/navigation/src/main/java/com/example/core/navigation/Navigator.kt +++ b/core/navigation/src/main/java/com/example/core/navigation/Navigator.kt @@ -4,13 +4,17 @@ import androidx.navigation.NavController class Navigator { lateinit var navController: NavController - fun navigateToFlow(navigationFlow: NavigationFlow) = when (navigationFlow) { - is NavigationFlow.PopularMoviesFlow -> navController.navigate( - MainNavGraphDirections.actionPopularMovieFeature() - ) - is NavigationFlow.MovieFlow -> navController.navigate( - MainNavGraphDirections.actionMovieFeature(movieId = navigationFlow.movieId) - ) - } -} \ No newline at end of file + fun navigateToFlow(navigationFlow: NavigationFlow) = + when (navigationFlow) { + is NavigationFlow.PopularMoviesFlow -> + navController.navigate( + MainNavGraphDirections.actionPopularMovieFeature(), + ) + + is NavigationFlow.MovieFlow -> + navController.navigate( + MainNavGraphDirections.actionMovieFeature(movieId = navigationFlow.movieId), + ) + } +} diff --git a/core/uiComponent/src/main/java/com/example/core/uicomponent/base/BaseFragment.kt b/core/uiComponent/src/main/java/com/example/core/uicomponent/base/BaseFragment.kt index 013cbec..4f6d51b 100644 --- a/core/uiComponent/src/main/java/com/example/core/uicomponent/base/BaseFragment.kt +++ b/core/uiComponent/src/main/java/com/example/core/uicomponent/base/BaseFragment.kt @@ -7,16 +7,21 @@ import androidx.viewbinding.ViewBinding import com.example.core.navigation.NavigationFlow import com.example.core.navigation.ToFlowNavigatable -abstract class BaseFragment(@LayoutRes idRes:Int) : Fragment(idRes) { +abstract class BaseFragment( + @LayoutRes idRes: Int, +) : Fragment(idRes) { protected abstract val binding: T - fun showStatus(text: String, duration: Int = Toast.LENGTH_SHORT) { + fun showStatus( + text: String, + duration: Int = Toast.LENGTH_SHORT, + ) { Toast.makeText(binding.root.context, text, duration).show() } - //навигация между графами - fun navigateTopLvl(navigationFlow: NavigationFlow){ + // навигация между графами + fun navigateTopLvl(navigationFlow: NavigationFlow) { (requireActivity() as? ToFlowNavigatable)?.navigateToFlow(navigationFlow) } - //навигация внутри графа просто через findNavController() + // навигация внутри графа просто через findNavController() } diff --git a/data/src/main/java/com/example/data/DataConst.kt b/data/src/main/java/com/example/data/DataConst.kt index ec2bfeb..d980455 100644 --- a/data/src/main/java/com/example/data/DataConst.kt +++ b/data/src/main/java/com/example/data/DataConst.kt @@ -3,4 +3,4 @@ package com.example.data object DataConst { const val IMAGE_PATH_CONST = "https://image.tmdb.org/t/p/w500" const val LANGUAGE_CONST = "en-US" -} \ No newline at end of file +} diff --git a/data/src/main/java/com/example/data/base/BaseRepository.kt b/data/src/main/java/com/example/data/base/BaseRepository.kt index 5813017..2f21a8a 100644 --- a/data/src/main/java/com/example/data/base/BaseRepository.kt +++ b/data/src/main/java/com/example/data/base/BaseRepository.kt @@ -1,10 +1,16 @@ package com.example.data.base import android.util.Log -import com.example.network.utils.exceptions.* +import com.example.network.utils.exceptions.LOCAL_ERROR_CODE +import com.example.network.utils.exceptions.NO_ERROR_CODE +import com.example.network.utils.exceptions.NO_NETWORK_ERROR_CODE +import com.example.network.utils.exceptions.NetworkException +import com.example.network.utils.exceptions.NoNetworkException +import com.example.network.utils.exceptions.PARSE_ERROR +import com.example.network.utils.exceptions.PARSE_ERROR_CODE +import com.example.network.utils.models.Error import com.example.network.utils.models.ResponseStatus import com.example.network.utils.models.ServerResponse -import com.example.network.utils.models.Error import com.google.gson.Gson import com.google.gson.JsonSyntaxException import com.google.gson.reflect.TypeToken @@ -18,9 +24,7 @@ import java.net.UnknownHostException typealias Request = suspend () -> Response> open class BaseRepository { - protected suspend fun safeApiCall(call: Request): ResponseStatus { - return safeApiResult(call) - } + protected suspend fun safeApiCall(call: Request): ResponseStatus = safeApiResult(call) private suspend fun safeApiResult(call: suspend () -> Response>): ResponseStatus { val response: Response> @@ -35,8 +39,8 @@ open class BaseRepository { NetworkException( errorBody?.message, Throwable(REPOSITORY), - errorBody?.code ?: 0 - ) + errorBody?.code ?: 0, + ), ) } catch (e: Exception) { Log.e("BaseRepository: ", e.message.toString()) @@ -44,28 +48,31 @@ open class BaseRepository { is UnknownHostException -> return ResponseStatus.LocalError( null, NoNetworkException(cause = Throwable(REPOSITORY), message = e.message), - NO_NETWORK_ERROR_CODE + NO_NETWORK_ERROR_CODE, ) is JsonSyntaxException -> { Log.e("BaseRepository: ", e.message.toString()) return ResponseStatus.ServerError( NetworkException( e.message, - Throwable(REPOSITORY), PARSE_ERROR_CODE - ) + Throwable(REPOSITORY), + PARSE_ERROR_CODE, + ), ) } is HttpException -> return ResponseStatus.LocalError( null, e.response()?.errorBody()?.parseError() ?: NullPointerException(), - e.code() + e.code(), ) else -> return ResponseStatus.LocalError(null, e, LOCAL_ERROR_CODE) } } } - protected suspend fun safeApiSuspendResultNoResponse(call: suspend () -> Response?): ResponseStatus { + protected suspend fun safeApiSuspendResultNoResponse( + call: suspend () -> Response?, + ): ResponseStatus { val response: Response? try { response = call.invoke() @@ -77,8 +84,8 @@ open class BaseRepository { NetworkException( errorBody?.message, Throwable(REPOSITORY), - errorBody?.code ?: NO_ERROR_CODE - ) + errorBody?.code ?: NO_ERROR_CODE, + ), ) } catch (e: Exception) { Log.e("BaseRepository: ", e.message.toString()) @@ -86,49 +93,48 @@ open class BaseRepository { is UnknownHostException -> return ResponseStatus.LocalError( null, NoNetworkException(cause = Throwable(REPOSITORY), message = e.message), - NO_NETWORK_ERROR_CODE + NO_NETWORK_ERROR_CODE, ) is JsonSyntaxException -> { Log.e("BaseRepository: ", e.message.toString()) return ResponseStatus.ServerError( NetworkException( e.message, - Throwable(REPOSITORY), PARSE_ERROR_CODE - ) + Throwable(REPOSITORY), + PARSE_ERROR_CODE, + ), ) } is HttpException -> return ResponseStatus.LocalError( null, e.response()?.errorBody()?.parseError() ?: NullPointerException(), - e.code() + e.code(), ) else -> return ResponseStatus.LocalError(null, e, LOCAL_ERROR_CODE) } } } - protected suspend fun map(call: suspend () ->G) : G?{ - return withContext(Dispatchers.Default) { + protected suspend fun map(call: suspend () -> G): G? = + withContext(Dispatchers.Default) { try { call.invoke() - } catch (e: Exception){ + } catch (e: Exception) { e.printStackTrace() null } } - } companion object { private const val REPOSITORY = "REPOSITORY" } } -fun ResponseBody.parseError(): Error { - return try { +fun ResponseBody.parseError(): Error = + try { val gson = Gson() val type = object : TypeToken() {}.type gson.fromJson(charStream(), type) } catch (e: JsonSyntaxException) { Error("", PARSE_ERROR, e.message) } -} diff --git a/data/src/main/java/com/example/data/mapper/MovieMapper.kt b/data/src/main/java/com/example/data/mapper/MovieMapper.kt index 4f70997..50f758a 100644 --- a/data/src/main/java/com/example/data/mapper/MovieMapper.kt +++ b/data/src/main/java/com/example/data/mapper/MovieMapper.kt @@ -4,8 +4,8 @@ import com.example.data.DataConst import com.example.movie.domain.MovieEntity import com.example.network.network.dto.response.MovieResponse -fun MovieResponse.asDomain() : MovieEntity { - return MovieEntity( +fun MovieResponse.asDomain(): MovieEntity = + MovieEntity( backdropPath = DataConst.IMAGE_PATH_CONST + this.backdropPath, budget = this.budget, id = this.id, @@ -17,6 +17,5 @@ fun MovieResponse.asDomain() : MovieEntity { status = this.status, title = this.title, voteAverage = this.voteAverage, - voteCount = this.voteCount + voteCount = this.voteCount, ) -} \ No newline at end of file diff --git a/data/src/main/java/com/example/data/mapper/PopularMoviesMapper.kt b/data/src/main/java/com/example/data/mapper/PopularMoviesMapper.kt index 7deeb98..07fb757 100644 --- a/data/src/main/java/com/example/data/mapper/PopularMoviesMapper.kt +++ b/data/src/main/java/com/example/data/mapper/PopularMoviesMapper.kt @@ -6,17 +6,16 @@ import com.example.network.network.dto.response.Results import com.example.popularmovies.domain.PopularMoviesEntity import com.example.popularmovies.domain.ResultsEntity -fun PopularMoviesResponse.asDomain(): PopularMoviesEntity { - return PopularMoviesEntity( +fun PopularMoviesResponse.asDomain(): PopularMoviesEntity = + PopularMoviesEntity( page = this.page, results = this.results.map { it.asDomain() }.toList(), totalPages = this.totalPages, - totalResults = this.totalResults + totalResults = this.totalResults, ) -} -fun Results.asDomain(): ResultsEntity { - return ResultsEntity( +fun Results.asDomain(): ResultsEntity = + ResultsEntity( adult = this.adult, backdropPath = DataConst.IMAGE_PATH_CONST + this.backdropPath, genreIds = this.genreIds, @@ -30,6 +29,5 @@ fun Results.asDomain(): ResultsEntity { title = this.title, video = this.video, voteAverage = this.voteAverage, - voteCount = this.voteCount + voteCount = this.voteCount, ) -} \ No newline at end of file diff --git a/data/src/main/java/com/example/data/movies_api_provider/ApiProvider.kt b/data/src/main/java/com/example/data/moviesApiProvider/ApiProvider.kt similarity index 65% rename from data/src/main/java/com/example/data/movies_api_provider/ApiProvider.kt rename to data/src/main/java/com/example/data/moviesApiProvider/ApiProvider.kt index 4a5806c..c0a3e5a 100644 --- a/data/src/main/java/com/example/data/movies_api_provider/ApiProvider.kt +++ b/data/src/main/java/com/example/data/moviesApiProvider/ApiProvider.kt @@ -1,10 +1,10 @@ -package com.example.data.movies_api_provider +package com.example.data.moviesApiProvider import com.example.network.network.api.Api import com.example.network.network.provider.NetworkProvider -class ApiProvider ( - private val provider: NetworkProvider -){ +class ApiProvider( + private val provider: NetworkProvider, +) { fun provideNetwork(baseUrl: String): Api = provider.provideRetrofit(Api::class.java, baseUrl) } diff --git a/data/src/main/java/com/example/data/repositories/MovieRepositoryImpl.kt b/data/src/main/java/com/example/data/repositories/MovieRepositoryImpl.kt index 69317d3..63c1d10 100644 --- a/data/src/main/java/com/example/data/repositories/MovieRepositoryImpl.kt +++ b/data/src/main/java/com/example/data/repositories/MovieRepositoryImpl.kt @@ -11,18 +11,21 @@ import com.example.network.network.ApiConst import com.example.network.network.api.Api import com.example.network.utils.models.ResponseStatus -class MovieRepositoryImpl ( - private val apiService: Api -) : BaseRepository(), MovieRepository { - override suspend fun getMovie(movieId: Int): Entity { - return when ( - val response = safeApiSuspendResultNoResponse { - apiService.getMovie( - apiKey = ApiConst.ACCESS_TOKEN, - language = DataConst.LANGUAGE_CONST, - movieId = movieId - ) - }) { +class MovieRepositoryImpl( + private val apiService: Api, +) : BaseRepository(), + MovieRepository { + override suspend fun getMovie(movieId: Int): Entity = + when ( + val response = + safeApiSuspendResultNoResponse { + apiService.getMovie( + apiKey = ApiConst.ACCESS_TOKEN, + language = DataConst.LANGUAGE_CONST, + movieId = movieId, + ) + } + ) { is ResponseStatus.Success -> { Log.d("MovieRepositoryImpl", response.data.toString()) response.data?.let { data -> @@ -41,5 +44,4 @@ class MovieRepositoryImpl ( Entity.Error("ServerError") } } - } -} \ No newline at end of file +} diff --git a/data/src/main/java/com/example/data/repositories/PopularMoviesRepositoryImpl.kt b/data/src/main/java/com/example/data/repositories/PopularMoviesRepositoryImpl.kt index 17382f2..57bdfb5 100644 --- a/data/src/main/java/com/example/data/repositories/PopularMoviesRepositoryImpl.kt +++ b/data/src/main/java/com/example/data/repositories/PopularMoviesRepositoryImpl.kt @@ -11,18 +11,21 @@ import com.example.popularmovies.domain.PopularMoviesEntity import com.example.popularmovies.domain.PopularMoviesRepository class PopularMoviesRepositoryImpl( - private val apiService: Api -) : PopularMoviesRepository, BaseRepository() { + private val apiService: Api, +) : BaseRepository(), + PopularMoviesRepository { // TODO token and language - override suspend fun getPopularMovies(page: Int): Entity { - return when ( - val response = safeApiSuspendResultNoResponse { - apiService.getPopularMovies( - apiKey = ACCESS_TOKEN, - language = LANGUAGE_CONST, - page = page - ) - }) { + override suspend fun getPopularMovies(page: Int): Entity = + when ( + val response = + safeApiSuspendResultNoResponse { + apiService.getPopularMovies( + apiKey = ACCESS_TOKEN, + language = LANGUAGE_CONST, + page = page, + ) + } + ) { is ResponseStatus.Success -> { response.data?.let { data -> map { Entity.Success(data.asDomain()) } @@ -34,5 +37,4 @@ class PopularMoviesRepositoryImpl( is ResponseStatus.LocalError -> Entity.Error(response.message) is ResponseStatus.ServerError -> Entity.Error("ServerError") } - } -} \ No newline at end of file +} diff --git a/domain/src/main/java/com/example/domain/MovieInteractorImpl.kt b/domain/src/main/java/com/example/domain/MovieInteractorImpl.kt index 792fae5..a013caa 100644 --- a/domain/src/main/java/com/example/domain/MovieInteractorImpl.kt +++ b/domain/src/main/java/com/example/domain/MovieInteractorImpl.kt @@ -6,10 +6,7 @@ import com.example.movie.domain.MovieInteractor import com.example.movie.domain.MovieRepository class MovieInteractorImpl( - private val movieRepository: MovieRepository + private val movieRepository: MovieRepository, ) : MovieInteractor { - override suspend fun getMovie(movieId: Int): Entity { - return movieRepository.getMovie(movieId) - } - -} \ No newline at end of file + override suspend fun getMovie(movieId: Int): Entity = movieRepository.getMovie(movieId) +} diff --git a/domain/src/main/java/com/example/domain/PopularMoviesInteractorImpl.kt b/domain/src/main/java/com/example/domain/PopularMoviesInteractorImpl.kt index a34a118..ccb9f7e 100644 --- a/domain/src/main/java/com/example/domain/PopularMoviesInteractorImpl.kt +++ b/domain/src/main/java/com/example/domain/PopularMoviesInteractorImpl.kt @@ -6,9 +6,8 @@ import com.example.popularmovies.domain.PopularMoviesInteractor import com.example.popularmovies.domain.PopularMoviesRepository class PopularMoviesInteractorImpl( - private val popularMoviesRepository: PopularMoviesRepository + private val popularMoviesRepository: PopularMoviesRepository, ) : PopularMoviesInteractor { - override suspend fun getPopularMovies(page: Int): Entity { - return popularMoviesRepository.getPopularMovies(page) - } -} \ No newline at end of file + override suspend fun getPopularMovies(page: Int): Entity = + popularMoviesRepository.getPopularMovies(page) +} diff --git a/features/movie/domain/src/main/java/com/example/movie/domain/MovieEntity.kt b/features/movie/domain/src/main/java/com/example/movie/domain/MovieEntity.kt index 01d545d..4df9ae4 100644 --- a/features/movie/domain/src/main/java/com/example/movie/domain/MovieEntity.kt +++ b/features/movie/domain/src/main/java/com/example/movie/domain/MovieEntity.kt @@ -1,6 +1,6 @@ package com.example.movie.domain -data class MovieEntity ( +data class MovieEntity( var backdropPath: String?, var budget: Int?, var id: Int?, @@ -12,5 +12,5 @@ data class MovieEntity ( var status: String?, var title: String?, var voteAverage: Double?, - var voteCount: Int? -) \ No newline at end of file + var voteCount: Int?, +) diff --git a/features/movie/domain/src/main/java/com/example/movie/domain/MovieInteractor.kt b/features/movie/domain/src/main/java/com/example/movie/domain/MovieInteractor.kt index 20312d8..0b6d8d0 100644 --- a/features/movie/domain/src/main/java/com/example/movie/domain/MovieInteractor.kt +++ b/features/movie/domain/src/main/java/com/example/movie/domain/MovieInteractor.kt @@ -3,5 +3,5 @@ package com.example.movie.domain import com.example.common.Entity interface MovieInteractor { - suspend fun getMovie(movieId : Int) : Entity -} \ No newline at end of file + suspend fun getMovie(movieId: Int): Entity +} diff --git a/features/movie/domain/src/main/java/com/example/movie/domain/MovieRepository.kt b/features/movie/domain/src/main/java/com/example/movie/domain/MovieRepository.kt index f5f31d7..1223f05 100644 --- a/features/movie/domain/src/main/java/com/example/movie/domain/MovieRepository.kt +++ b/features/movie/domain/src/main/java/com/example/movie/domain/MovieRepository.kt @@ -3,5 +3,5 @@ package com.example.movie.domain import com.example.common.Entity interface MovieRepository { - suspend fun getMovie(movieId : Int) : Entity -} \ No newline at end of file + suspend fun getMovie(movieId: Int): Entity +} diff --git a/features/movie/presentation/src/main/java/com/example/movie/presentation/di/MovieComponent.kt b/features/movie/presentation/src/main/java/com/example/movie/presentation/di/MovieComponent.kt index 4497ef8..d0bfeba 100644 --- a/features/movie/presentation/src/main/java/com/example/movie/presentation/di/MovieComponent.kt +++ b/features/movie/presentation/src/main/java/com/example/movie/presentation/di/MovieComponent.kt @@ -10,12 +10,13 @@ import dagger.Component @Component(dependencies = [MovieDeps::class]) interface MovieComponent { @Component.Factory - interface Factory{ - fun create(deps: MovieDeps) : MovieComponent + interface Factory { + fun create(deps: MovieDeps): MovieComponent } - fun injectFragment (movieFragment: MovieFragment) + + fun injectFragment(movieFragment: MovieFragment) } interface MovieDeps : Dependencies { val movieInteractor: MovieInteractor -} \ No newline at end of file +} diff --git a/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieExecutorImpl.kt b/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieExecutorImpl.kt index 3d017af..7f0c632 100644 --- a/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieExecutorImpl.kt +++ b/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieExecutorImpl.kt @@ -7,7 +7,7 @@ import com.example.movie.domain.MovieInteractor import kotlinx.coroutines.launch internal class MovieExecutorImpl( - private val interactor: MovieInteractor + private val interactor: MovieInteractor, ) : CoroutineExecutor() { override fun executeIntent(intent: MovieStore.Intent) { when (intent) { @@ -36,4 +36,4 @@ internal class MovieExecutorImpl( } } } -} \ No newline at end of file +} diff --git a/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieFragment.kt b/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieFragment.kt index 8b782f4..92a7119 100644 --- a/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieFragment.kt +++ b/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieFragment.kt @@ -19,13 +19,13 @@ import kotlinx.coroutines.launch import javax.inject.Inject const val MOVIE_ID = "movieId" -class MovieFragment : - BaseFragment(R.layout.fragment_movie) { + +class MovieFragment : BaseFragment(R.layout.fragment_movie) { override val binding by viewBinding(FragmentMovieBinding::bind) @Inject lateinit var storeFactoryProvider: MovieStoreFactoryProvider - private var movieId :Int = 0 + private var movieId: Int = 0 private val movieStore by lazy { storeFactoryProvider.create().create(movieId) @@ -36,20 +36,22 @@ class MovieFragment : DaggerMovieComponent.factory().create(findDependencies()).injectFragment(this) } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) movieId = arguments?.getString(MOVIE_ID, "0")?.toInt() ?: 0 } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle?, + ) { super.onViewCreated(view, savedInstanceState) setObservers() } private fun setObservers() { - viewLifecycleOwner.lifecycleScope.launch{ - lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED){ + viewLifecycleOwner.lifecycleScope.launch { + lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) { movieStore.states.collect { state -> with(binding) { progressBar.isVisible = state.isLoading @@ -61,12 +63,12 @@ class MovieFragment : reloadButton.visibility = View.VISIBLE contentLayout.visibility = View.GONE - } else{ + } else { errorTextView.visibility = View.GONE errorTextView.visibility = View.GONE reloadButton.visibility = View.GONE contentLayout.visibility = View.VISIBLE - with(state){ + with(state) { Picasso.get().load(movie?.backdropPath).into(posterImageView) titleTextView.text = movie?.title ?: getString(R.string.unknown) overviewTextView.text = movie?.overview ?: getString(R.string.unknown) @@ -82,8 +84,8 @@ class MovieFragment : } } } - binding.reloadButton.setOnClickListener{ + binding.reloadButton.setOnClickListener { movieStore.accept(MovieStore.Intent.Reload(movieId)) } } -} \ No newline at end of file +} diff --git a/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieReducer.kt b/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieReducer.kt index c76a1e8..9b42433 100644 --- a/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieReducer.kt +++ b/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieReducer.kt @@ -5,13 +5,19 @@ import com.arkivanov.mvikotlin.core.store.Reducer import com.example.movie.domain.MovieEntity sealed interface Msg { - data class MovieLoaded(val movie: MovieEntity?) : Msg + data class MovieLoaded( + val movie: MovieEntity?, + ) : Msg + object LoadingStarted : Msg - data class LoadingFailed(val error: String) : Msg + + data class LoadingFailed( + val error: String, + ) : Msg } object MovieReducerImpl : Reducer { - override fun MovieStore.State.reduce(msg: Msg): MovieStore.State{ + override fun MovieStore.State.reduce(msg: Msg): MovieStore.State { Log.d("MovieReducerImpl", "Current state: $this, Message: $msg") return when (msg) { is Msg.LoadingStarted -> copy(isLoading = true, error = null) @@ -19,4 +25,4 @@ object MovieReducerImpl : Reducer { is Msg.LoadingFailed -> copy(isLoading = false, error = msg.error) } } -} \ No newline at end of file +} diff --git a/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieStore.kt b/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieStore.kt index fbb0994..661ce2b 100644 --- a/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieStore.kt +++ b/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieStore.kt @@ -5,16 +5,20 @@ import com.example.movie.domain.MovieEntity interface MovieStore : Store { sealed interface Action { - class Load(val movieId: Int) : Action + class Load( + val movieId: Int, + ) : Action } sealed interface Intent { - class Reload(val movieId: Int) : Intent + class Reload( + val movieId: Int, + ) : Intent } data class State( val movie: MovieEntity? = null, val isLoading: Boolean = false, - val error: String? = null + val error: String? = null, ) -} \ No newline at end of file +} diff --git a/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieStoreFactory.kt b/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieStoreFactory.kt index 9534c3b..07feac4 100644 --- a/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieStoreFactory.kt +++ b/features/movie/presentation/src/main/java/com/example/movie/presentation/ui/MovieStoreFactory.kt @@ -10,24 +10,24 @@ import javax.inject.Provider class MovieStoreFactory( private val storeFactory: StoreFactory, - private val interactor: MovieInteractor + private val interactor: MovieInteractor, ) { - fun create(movieId: Int): MovieStore = - object : MovieStore, + object : + MovieStore, Store by storeFactory.create( name = "MovieStore", initialState = MovieStore.State(), bootstrapper = SimpleBootstrapper(MovieStore.Action.Load(movieId)), executorFactory = { MovieExecutorImpl(interactor) }, - reducer = MovieReducerImpl + reducer = MovieReducerImpl, ) {} } -class MovieStoreFactoryProvider @Inject constructor( - private val interactor: Provider -) { - fun create(): MovieStoreFactory { - return MovieStoreFactory(DefaultStoreFactory(), interactor.get()) +class MovieStoreFactoryProvider + @Inject + constructor( + private val interactor: Provider, + ) { + fun create(): MovieStoreFactory = MovieStoreFactory(DefaultStoreFactory(), interactor.get()) } -} \ No newline at end of file diff --git a/features/popularmovies/domain/src/main/java/com/example/popularmovies/domain/PopularMoviesEntity.kt b/features/popularmovies/domain/src/main/java/com/example/popularmovies/domain/PopularMoviesEntity.kt index 758cc54..c0ef15f 100644 --- a/features/popularmovies/domain/src/main/java/com/example/popularmovies/domain/PopularMoviesEntity.kt +++ b/features/popularmovies/domain/src/main/java/com/example/popularmovies/domain/PopularMoviesEntity.kt @@ -21,5 +21,5 @@ data class ResultsEntity( val title: String?, val video: Boolean?, val voteAverage: Double?, - val voteCount: Int? -) \ No newline at end of file + val voteCount: Int?, +) diff --git a/features/popularmovies/domain/src/main/java/com/example/popularmovies/domain/PopularMoviesInteractor.kt b/features/popularmovies/domain/src/main/java/com/example/popularmovies/domain/PopularMoviesInteractor.kt index 20d1c1d..14ab360 100644 --- a/features/popularmovies/domain/src/main/java/com/example/popularmovies/domain/PopularMoviesInteractor.kt +++ b/features/popularmovies/domain/src/main/java/com/example/popularmovies/domain/PopularMoviesInteractor.kt @@ -3,5 +3,5 @@ package com.example.popularmovies.domain import com.example.common.Entity interface PopularMoviesInteractor { - suspend fun getPopularMovies(page : Int) : Entity -} \ No newline at end of file + suspend fun getPopularMovies(page: Int): Entity +} diff --git a/features/popularmovies/domain/src/main/java/com/example/popularmovies/domain/PopularMoviesRepository.kt b/features/popularmovies/domain/src/main/java/com/example/popularmovies/domain/PopularMoviesRepository.kt index d13caca..fe87e21 100644 --- a/features/popularmovies/domain/src/main/java/com/example/popularmovies/domain/PopularMoviesRepository.kt +++ b/features/popularmovies/domain/src/main/java/com/example/popularmovies/domain/PopularMoviesRepository.kt @@ -3,5 +3,5 @@ package com.example.popularmovies.domain import com.example.common.Entity interface PopularMoviesRepository { - suspend fun getPopularMovies(page: Int) : Entity -} \ No newline at end of file + suspend fun getPopularMovies(page: Int): Entity +} diff --git a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/di/PopularMoviesComponent.kt b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/di/PopularMoviesComponent.kt index afd3c4a..e33ed38 100644 --- a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/di/PopularMoviesComponent.kt +++ b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/di/PopularMoviesComponent.kt @@ -10,10 +10,11 @@ import dagger.Component @Component(dependencies = [PopularMoviesDeps::class]) interface PopularMoviesComponent { @Component.Factory - interface Factory{ - fun create(deps: PopularMoviesDeps) : PopularMoviesComponent + interface Factory { + fun create(deps: PopularMoviesDeps): PopularMoviesComponent } - fun injectFragment (popularMoviesFragment: PopularMoviesFragment) + + fun injectFragment(popularMoviesFragment: PopularMoviesFragment) } interface PopularMoviesDeps : Dependencies { diff --git a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/MovieModel.kt b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/MovieModel.kt index e1dea53..442dff5 100644 --- a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/MovieModel.kt +++ b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/MovieModel.kt @@ -1,9 +1,9 @@ package com.example.popularmovies.presentation.ui -data class MovieModel ( +data class MovieModel( val id: Int?, val title: String?, val posterPath: String?, val voteAverage: Double?, - val overview: String? + val overview: String?, ) diff --git a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesExecutorImpl.kt b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesExecutorImpl.kt index 43f3d78..fa0222b 100644 --- a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesExecutorImpl.kt +++ b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesExecutorImpl.kt @@ -9,17 +9,16 @@ import com.example.popularmovies.presentation.ui.adapter.MoviesPagingSource import kotlinx.coroutines.launch internal class PopularMoviesExecutorImpl( - private val interactor: PopularMoviesInteractor + private val interactor: PopularMoviesInteractor, ) : CoroutineExecutor() { - override fun executeIntent(intent: PopularMoviesStore.Intent) { - when(intent){ + when (intent) { is PopularMoviesStore.Intent.ReloadMovies -> loadMovies() } } override fun executeAction(action: PopularMoviesStore.Action) { - when(action){ + when (action) { is PopularMoviesStore.Action.LoadMovies -> loadMovies() } } @@ -27,16 +26,18 @@ internal class PopularMoviesExecutorImpl( private fun loadMovies() { dispatch(Msg.LoadingStarted) scope.launch { - val pager = Pager( - config = PagingConfig( - pageSize = 20, - enablePlaceholders = false - ), - pagingSourceFactory = { MoviesPagingSource(interactor) } - ).flow.cachedIn(scope) + val pager = + Pager( + config = + PagingConfig( + pageSize = 20, + enablePlaceholders = false, + ), + pagingSourceFactory = { MoviesPagingSource(interactor) }, + ).flow.cachedIn(scope) pager.collect { pagerData -> dispatch(Msg.MoviesLoaded(pagerData)) } } } -} \ No newline at end of file +} diff --git a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesFragment.kt b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesFragment.kt index b8e869d..9b77dfc 100644 --- a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesFragment.kt +++ b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesFragment.kt @@ -22,8 +22,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import javax.inject.Inject -class PopularMoviesFragment : - BaseFragment(R.layout.fragment_popular_movies) { +class PopularMoviesFragment : BaseFragment(R.layout.fragment_popular_movies) { override val binding by viewBinding(FragmentPopularMoviesBinding::bind) @Inject @@ -38,12 +37,16 @@ class PopularMoviesFragment : DaggerPopularMoviesComponent.factory().create(findDependencies()).injectFragment(this) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle?, + ) { super.onViewCreated(view, savedInstanceState) - val moviesAdapter = PopularMoviesAdapter { movieId -> - navigateTopLvl(NavigationFlow.MovieFlow(movieId.toString())) - } + val moviesAdapter = + PopularMoviesAdapter { movieId -> + navigateTopLvl(NavigationFlow.MovieFlow(movieId.toString())) + } binding.recyclerView.apply { layoutManager = LinearLayoutManager(context) adapter = moviesAdapter @@ -70,4 +73,4 @@ class PopularMoviesFragment : popularMoviesStore.accept(PopularMoviesStore.Intent.ReloadMovies) } } -} \ No newline at end of file +} diff --git a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesReducer.kt b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesReducer.kt index 65f4a15..ab26f59 100644 --- a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesReducer.kt +++ b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesReducer.kt @@ -5,13 +5,19 @@ import androidx.paging.PagingData import com.arkivanov.mvikotlin.core.store.Reducer sealed interface Msg { - data class MoviesLoaded(val movies: PagingData) : Msg + data class MoviesLoaded( + val movies: PagingData, + ) : Msg + object LoadingStarted : Msg - data class LoadingFailed(val error: String) : Msg + + data class LoadingFailed( + val error: String, + ) : Msg } object PopularMoviesReducerImpl : Reducer { - override fun PopularMoviesStore.State.reduce(msg: Msg): PopularMoviesStore.State{ + override fun PopularMoviesStore.State.reduce(msg: Msg): PopularMoviesStore.State { Log.d("PopularMoviesReducerImpl", "Current state: $this, Message: $msg") return when (msg) { is Msg.LoadingStarted -> copy(isLoading = true, error = null) @@ -19,4 +25,4 @@ object PopularMoviesReducerImpl : Reducer { is Msg.LoadingFailed -> copy(isLoading = false, error = msg.error) } } -} \ No newline at end of file +} diff --git a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesStore.kt b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesStore.kt index 78d2151..f0b4f66 100644 --- a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesStore.kt +++ b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesStore.kt @@ -4,7 +4,6 @@ import androidx.paging.PagingData import com.arkivanov.mvikotlin.core.store.Store interface PopularMoviesStore : Store { - sealed interface Action { object LoadMovies : Action } @@ -16,6 +15,6 @@ interface PopularMoviesStore : Store = PagingData.empty(), val isLoading: Boolean = false, - val error: String? = null + val error: String? = null, ) -} \ No newline at end of file +} diff --git a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesStoreFactory.kt b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesStoreFactory.kt index e6e462d..7ac7c24 100644 --- a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesStoreFactory.kt +++ b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/PopularMoviesStoreFactory.kt @@ -8,26 +8,26 @@ import com.example.popularmovies.domain.PopularMoviesInteractor import javax.inject.Inject import javax.inject.Provider - class PopularMoviesStoreFactory( private val storeFactory: StoreFactory, - private val interactor: PopularMoviesInteractor + private val interactor: PopularMoviesInteractor, ) { - fun create(): PopularMoviesStore = - object : PopularMoviesStore, + object : + PopularMoviesStore, Store by storeFactory.create( name = "PopularMoviesStore", initialState = PopularMoviesStore.State(), bootstrapper = SimpleBootstrapper(PopularMoviesStore.Action.LoadMovies), executorFactory = { PopularMoviesExecutorImpl(interactor) }, - reducer = PopularMoviesReducerImpl + reducer = PopularMoviesReducerImpl, ) {} } -class PopularMoviesStoreFactoryProvider @Inject constructor( - private val interactor: Provider -) { - fun create(): PopularMoviesStoreFactory { - return PopularMoviesStoreFactory(DefaultStoreFactory(), interactor.get()) + +class PopularMoviesStoreFactoryProvider + @Inject + constructor( + private val interactor: Provider, + ) { + fun create(): PopularMoviesStoreFactory = PopularMoviesStoreFactory(DefaultStoreFactory(), interactor.get()) } -} \ No newline at end of file diff --git a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/adapter/MoviesPagingSource.kt b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/adapter/MoviesPagingSource.kt index 617f3b7..921a969 100644 --- a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/adapter/MoviesPagingSource.kt +++ b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/adapter/MoviesPagingSource.kt @@ -7,28 +7,29 @@ import com.example.popularmovies.domain.PopularMoviesInteractor import com.example.popularmovies.presentation.ui.MovieModel class MoviesPagingSource( - private val interactor: PopularMoviesInteractor + private val interactor: PopularMoviesInteractor, ) : PagingSource() { override suspend fun load(params: LoadParams): LoadResult { val page = params.key ?: 1 return try { when (val result = interactor.getPopularMovies(page)) { is Entity.Success -> { - val movies = result.data?.results?.mapNotNull { resultEntity -> - resultEntity?.let { - MovieModel( - id = it.id, - title = it.originalTitle, - posterPath = it.posterPath, - voteAverage = it.voteAverage, - overview = it.overview - ) + val movies = + result.data?.results?.mapNotNull { resultEntity -> + resultEntity?.let { + MovieModel( + id = it.id, + title = it.originalTitle, + posterPath = it.posterPath, + voteAverage = it.voteAverage, + overview = it.overview, + ) + } } - } LoadResult.Page( data = movies.orEmpty(), prevKey = if (page == 1) null else page - 1, - nextKey = if (movies?.isEmpty() == true) null else page + 1 + nextKey = if (movies?.isEmpty() == true) null else page + 1, ) } is Entity.Error -> { @@ -40,10 +41,9 @@ class MoviesPagingSource( } } - override fun getRefreshKey(state: PagingState): Int? { - return state.anchorPosition?.let { anchorPosition -> + override fun getRefreshKey(state: PagingState): Int? = + state.anchorPosition?.let { anchorPosition -> state.closestPageToPosition(anchorPosition)?.prevKey?.plus(1) ?: state.closestPageToPosition(anchorPosition)?.nextKey?.minus(1) } - } -} \ No newline at end of file +} diff --git a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/adapter/PopularMoviesAdapter.kt b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/adapter/PopularMoviesAdapter.kt index 6fb328f..1f9c795 100644 --- a/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/adapter/PopularMoviesAdapter.kt +++ b/features/popularmovies/presentation/src/main/java/com/example/popularmovies/presentation/ui/adapter/PopularMoviesAdapter.kt @@ -10,42 +10,51 @@ import com.example.popularmovies.presentation.ui.MovieModel import com.squareup.picasso.Picasso class PopularMoviesAdapter( - private val onItemClick: (Int) -> Unit + private val onItemClick: (Int) -> Unit, ) : PagingDataAdapter( - DataDifferentiator -) { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder( + DataDifferentiator, + ) { + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int, + ) = ViewHolder( MovieItemBinding.inflate(LayoutInflater.from(parent.context), parent, false), - onItemClick + onItemClick, ) - override fun onBindViewHolder(holder: ViewHolder, position: Int) { + override fun onBindViewHolder( + holder: ViewHolder, + position: Int, + ) { getItem(position)?.let { holder.bind(it) } } class ViewHolder( private val binding: MovieItemBinding, - private val onItemClick: (Int) -> Unit + private val onItemClick: (Int) -> Unit, ) : RecyclerView.ViewHolder(binding.root) { - fun bind(movieModel: MovieModel) = with(binding) { - title.text = movieModel.title - Picasso.get().load(movieModel.posterPath).into(poster) - description.text = movieModel.overview - rating.text = movieModel.voteAverage.toString() + fun bind(movieModel: MovieModel) = + with(binding) { + title.text = movieModel.title + Picasso.get().load(movieModel.posterPath).into(poster) + description.text = movieModel.overview + rating.text = movieModel.voteAverage.toString() - root.setOnClickListener { - movieModel.id?.let { id -> onItemClick(id) } + root.setOnClickListener { + movieModel.id?.let { id -> onItemClick(id) } + } } - } } object DataDifferentiator : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: MovieModel, newItem: MovieModel): Boolean { - return oldItem.id == newItem.id - } + override fun areItemsTheSame( + oldItem: MovieModel, + newItem: MovieModel, + ): Boolean = oldItem.id == newItem.id - override fun areContentsTheSame(oldItem: MovieModel, newItem: MovieModel): Boolean { - return oldItem == newItem - } + override fun areContentsTheSame( + oldItem: MovieModel, + newItem: MovieModel, + ): Boolean = oldItem == newItem } -} \ No newline at end of file +} diff --git a/network/network/src/main/java/com/example/network/network/dto/response/MovieResponse.kt b/network/network/src/main/java/com/example/network/network/dto/response/MovieResponse.kt index cc7c48e..3b373ed 100644 --- a/network/network/src/main/java/com/example/network/network/dto/response/MovieResponse.kt +++ b/network/network/src/main/java/com/example/network/network/dto/response/MovieResponse.kt @@ -26,5 +26,5 @@ data class MovieResponse( @SerializedName("vote_average") var voteAverage: Double? = null, @SerializedName("vote_count") - var voteCount: Int? = null -) \ No newline at end of file + var voteCount: Int? = null, +) diff --git a/network/network/src/main/java/com/example/network/network/dto/response/PopularMoviesResponse.kt b/network/network/src/main/java/com/example/network/network/dto/response/PopularMoviesResponse.kt index b4e08bc..28a10b3 100644 --- a/network/network/src/main/java/com/example/network/network/dto/response/PopularMoviesResponse.kt +++ b/network/network/src/main/java/com/example/network/network/dto/response/PopularMoviesResponse.kt @@ -10,7 +10,7 @@ data class PopularMoviesResponse( @SerializedName("total_pages") var totalPages: Int? = null, @SerializedName("total_results") - var totalResults: Int? = null + var totalResults: Int? = null, ) data class Results( @@ -41,5 +41,5 @@ data class Results( @SerializedName("vote_average") var voteAverage: Double? = null, @SerializedName("vote_count") - var voteCount: Int? = null + var voteCount: Int? = null, ) diff --git a/network/network/src/main/java/com/example/network/network/provider/NetworkProvider.kt b/network/network/src/main/java/com/example/network/network/provider/NetworkProvider.kt index 3bba398..25888e3 100644 --- a/network/network/src/main/java/com/example/network/network/provider/NetworkProvider.kt +++ b/network/network/src/main/java/com/example/network/network/provider/NetworkProvider.kt @@ -9,39 +9,43 @@ import retrofit2.converter.gson.GsonConverterFactory import java.util.concurrent.TimeUnit class NetworkProvider( - private val connectivityManager: ConnectivityManager + private val connectivityManager: ConnectivityManager, ) { private var gson = GsonBuilder().setLenient().create() private val timeout: Long = 60 - private val client: OkHttpClient = OkHttpClient.Builder().apply { - connectTimeout(timeout, TimeUnit.SECONDS) - readTimeout(timeout, TimeUnit.SECONDS) - writeTimeout(timeout, TimeUnit.SECONDS) - }.build() + private val client: OkHttpClient = + OkHttpClient + .Builder() + .apply { + connectTimeout(timeout, TimeUnit.SECONDS) + readTimeout(timeout, TimeUnit.SECONDS) + writeTimeout(timeout, TimeUnit.SECONDS) + }.build() fun provideRetrofit( clazz: Class, - url: String - ): T { - return Retrofit.Builder() + url: String, + ): T = + Retrofit + .Builder() .baseUrl(url) .client(client) .addConverterFactory(GsonConverterFactory.create(gson)) .build() .create(clazz) - } fun isInternetAvailable(): Boolean { val networkCapabilities = connectivityManager.activeNetwork ?: return false val actNetworkManager = connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false - val result = when { - actNetworkManager.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true - actNetworkManager.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true - actNetworkManager.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true - else -> false - } + val result = + when { + actNetworkManager.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true + actNetworkManager.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true + actNetworkManager.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true + else -> false + } return result } } diff --git a/network/utils/src/main/java/com/example/network/utils/exceptions/NetworkException.kt b/network/utils/src/main/java/com/example/network/utils/exceptions/NetworkException.kt index 50fd26b..6d77f5a 100644 --- a/network/utils/src/main/java/com/example/network/utils/exceptions/NetworkException.kt +++ b/network/utils/src/main/java/com/example/network/utils/exceptions/NetworkException.kt @@ -8,5 +8,5 @@ class NetworkException( class NoNetworkException( override val message: String?, - override val cause: Throwable + override val cause: Throwable, ) : Exception(message, cause) diff --git a/network/utils/src/main/java/com/example/network/utils/models/Error.kt b/network/utils/src/main/java/com/example/network/utils/models/Error.kt index afcb84c..d4da9de 100644 --- a/network/utils/src/main/java/com/example/network/utils/models/Error.kt +++ b/network/utils/src/main/java/com/example/network/utils/models/Error.kt @@ -8,5 +8,5 @@ data class Error( @SerializedName("code") var code: Int? = 0, @SerializedName("message") - override var message: String? = "" + override var message: String? = "", ) : Exception() diff --git a/network/utils/src/main/java/com/example/network/utils/models/ResponseStatus.kt b/network/utils/src/main/java/com/example/network/utils/models/ResponseStatus.kt index 7b7cf38..875d3e6 100644 --- a/network/utils/src/main/java/com/example/network/utils/models/ResponseStatus.kt +++ b/network/utils/src/main/java/com/example/network/utils/models/ResponseStatus.kt @@ -3,37 +3,36 @@ package com.example.network.utils.models import com.example.network.utils.exceptions.NetworkException sealed class ResponseStatus { - data class Success(val data: T?, val code: Int) : ResponseStatus() { - override fun map(mapper: (oldValue: T?) -> K?): Success { - return Success(mapper.invoke(data), code) - } + data class Success( + val data: T?, + val code: Int, + ) : ResponseStatus() { + override fun map(mapper: (oldValue: T?) -> K?): Success = Success(mapper.invoke(data), code) } - data class ServerError(val exception: NetworkException, val localData: T? = null) : - ResponseStatus() { - override fun map(mapper: (oldValue: T?) -> K?): ServerError { - return ServerError(exception, mapper.invoke(localData)) - } + data class ServerError( + val exception: NetworkException, + val localData: T? = null, + ) : ResponseStatus() { + override fun map(mapper: (oldValue: T?) -> K?): ServerError = + ServerError(exception, mapper.invoke(localData)) } data class LocalError( val localData: T?, val exception: Exception, val code: Int, - val message: String = "" - ) : - ResponseStatus() { - override fun map(mapper: (oldValue: T?) -> K?): LocalError { - return LocalError(mapper.invoke(localData), exception, code) - } + val message: String = "", + ) : ResponseStatus() { + override fun map(mapper: (oldValue: T?) -> K?): LocalError = + LocalError(mapper.invoke(localData), exception, code) } - fun getSuccessData(): T? { - return when (this) { + fun getSuccessData(): T? = + when (this) { is Success -> data else -> null } - } abstract fun map(mapper: (oldValue: T?) -> K?): ResponseStatus } diff --git a/network/utils/src/main/java/com/example/network/utils/models/ServerResponse.kt b/network/utils/src/main/java/com/example/network/utils/models/ServerResponse.kt index 9ab3232..e9f55e4 100644 --- a/network/utils/src/main/java/com/example/network/utils/models/ServerResponse.kt +++ b/network/utils/src/main/java/com/example/network/utils/models/ServerResponse.kt @@ -6,5 +6,5 @@ data class ServerResponse( @SerializedName("message") val message: String?, @SerializedName("error") var isError: Boolean?, @SerializedName("code") val code: Int?, - @SerializedName("data") val data: T? + @SerializedName("data") val data: T?, )