├── app ├── .gitignore ├── src │ └── main │ │ ├── res │ │ ├── values │ │ │ ├── strings.xml │ │ │ └── themes.xml │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── values-night │ │ │ └── themes.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── xml │ │ │ ├── backup_rules.xml │ │ │ └── data_extraction_rules.xml │ │ └── drawable │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── ic_launcher_background.xml │ │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── composefeaturebasedmultimodule │ │ │ ├── MainApplication.kt │ │ │ ├── ui │ │ │ └── theme │ │ │ │ ├── Color.kt │ │ │ │ ├── Type.kt │ │ │ │ └── Theme.kt │ │ │ └── SingleActivity.kt │ │ └── AndroidManifest.xml ├── proguard-rules.pro └── build.gradle.kts ├── core ├── .gitignore ├── consumer-rules.pro ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── example │ │ └── core │ │ ├── utils │ │ ├── Constants.kt │ │ └── Qualifiers.kt │ │ ├── model │ │ └── GenericException.kt │ │ ├── navigation │ │ └── NavigationService.kt │ │ ├── di │ │ └── CoroutineModule.kt │ │ ├── components │ │ ├── LoadingComponent.kt │ │ ├── ErrorComponent.kt │ │ └── CoilImageComponent.kt │ │ └── presentation │ │ └── StateAndEventViewModel.kt ├── proguard-rules.pro └── build.gradle.kts ├── detail ├── .gitignore ├── consumer-rules.pro ├── src │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── detail │ │ │ ├── domain │ │ │ ├── usecase │ │ │ │ └── GetItemDetailUseCase.kt │ │ │ └── model │ │ │ │ └── ItemDetail.kt │ │ │ ├── data │ │ │ ├── api │ │ │ │ ├── datasource │ │ │ │ │ ├── DetailDataSource.kt │ │ │ │ │ └── DetailDataSourceImpl.kt │ │ │ │ ├── DetailApi.kt │ │ │ │ ├── model │ │ │ │ │ └── ItemDetailResponse.kt │ │ │ │ └── di │ │ │ │ │ └── DataSourceModule.kt │ │ │ └── domain_impl │ │ │ │ ├── usecase │ │ │ │ └── GetItemDetailUseCaseImpl.kt │ │ │ │ ├── di │ │ │ │ └── UseCaseModule.kt │ │ │ │ └── mapper │ │ │ │ └── ItemDetailMapper.kt │ │ │ └── presentation │ │ │ ├── uievent │ │ │ └── DetailUIEvent.kt │ │ │ ├── state │ │ │ └── DetailUIState.kt │ │ │ ├── DetailScreen.kt │ │ │ ├── DetailSearchScreen.kt │ │ │ ├── components │ │ │ └── DetailContent.kt │ │ │ └── DetailViewModel.kt │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── detail │ │ ├── data │ │ ├── datasource │ │ │ └── DetailDataSourceTest.kt │ │ └── domainimpl │ │ │ └── GetItemDetailUseCaseTest.kt │ │ └── presentation │ │ └── DetailViewModelTest.kt ├── proguard-rules.pro └── build.gradle.kts ├── home ├── .gitignore ├── consumer-rules.pro ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── example │ │ └── home │ │ ├── domain │ │ ├── model │ │ │ ├── CatalogItem.kt │ │ │ ├── BannerItem.kt │ │ │ ├── ProductItem.kt │ │ │ └── HomeSections.kt │ │ └── usecase │ │ │ └── GetInitialHomeUseCase.kt │ │ ├── data │ │ ├── api │ │ │ ├── datasource │ │ │ │ ├── HomeDataSource.kt │ │ │ │ └── HomeDataSourceImpl.kt │ │ │ ├── HomeApi.kt │ │ │ ├── di │ │ │ │ └── DataSourceModule.kt │ │ │ └── model │ │ │ │ └── HomeResponse.kt │ │ └── domainimpl │ │ │ ├── usecase │ │ │ └── GetInitialHomeUseCaseImpl.kt │ │ │ ├── di │ │ │ └── UseCaseModule.kt │ │ │ └── mapper │ │ │ └── HomeSectionsMapper.kt │ │ └── presentation │ │ ├── components │ │ ├── HomeScreenContent.kt │ │ ├── SectionList.kt │ │ ├── DetailBottomSheet.kt │ │ └── VerticalItemCard.kt │ │ ├── uievent │ │ └── HomeUIEvent.kt │ │ ├── state │ │ └── HomeUIState.kt │ │ ├── sections │ │ ├── SectionTitle.kt │ │ ├── BannerSection.kt │ │ └── SlidableSection.kt │ │ ├── HomeScreen.kt │ │ └── HomeViewModel.kt ├── proguard-rules.pro └── build.gradle.kts ├── list ├── .gitignore ├── consumer-rules.pro ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── example │ │ └── list │ │ ├── presentation │ │ ├── event │ │ │ └── ListUIEvent.kt │ │ ├── state │ │ │ └── ListUIState.kt │ │ ├── ListScreen.kt │ │ ├── ListViewModel.kt │ │ └── components │ │ │ └── ListContent.kt │ │ ├── data │ │ ├── api │ │ │ ├── datasource │ │ │ │ ├── ListDataSource.kt │ │ │ │ └── ListDataSourceImpl.kt │ │ │ ├── ListApi.kt │ │ │ ├── model │ │ │ │ └── ListResponse.kt │ │ │ └── di │ │ │ │ └── DataSourceModule.kt │ │ └── domain_impl │ │ │ ├── mapper │ │ │ └── ListDataMapper.kt │ │ │ ├── usecase │ │ │ └── GetListUseCaseImpl.kt │ │ │ └── di │ │ │ └── UseCaseModule.kt │ │ └── domain │ │ ├── usecase │ │ └── GetListUseCase.kt │ │ └── model │ │ └── ListData.kt ├── proguard-rules.pro └── build.gradle.kts ├── navigation ├── .gitignore ├── consumer-rules.pro ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── example │ │ └── navigation │ │ ├── utils │ │ ├── ArgsScreen.kt │ │ ├── NavigationGraph.kt │ │ ├── NodeScreen.kt │ │ ├── NavigationDestination.kt │ │ └── WithoutArgsScreen.kt │ │ ├── screens │ │ ├── Home.kt │ │ ├── List.kt │ │ └── Detail.kt │ │ ├── Destination.kt │ │ ├── di │ │ └── NavigationModule.kt │ │ ├── graph │ │ ├── DetailGraph.kt │ │ ├── DetailMain.kt │ │ ├── DetailSearch.kt │ │ └── DetailGraphBuilder.kt │ │ ├── Navigator.kt │ │ └── AppNavigation.kt ├── proguard-rules.pro └── build.gradle.kts ├── network ├── .gitignore ├── consumer-rules.pro ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── example │ │ └── network │ │ ├── extensions │ │ └── ApiHelper.kt │ │ └── di │ │ └── NetworkModule.kt ├── proguard-rules.pro └── build.gradle.kts ├── .idea ├── .gitignore ├── kotlinScripting.xml ├── compiler.xml ├── kotlinc.xml ├── vcs.xml ├── deploymentTargetDropDown.xml ├── migrations.xml ├── misc.xml ├── gradle.xml ├── appInsightsSettings.xml └── inspectionProfiles │ └── Project_Default.xml ├── gradle ├── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties └── libs.versions.toml ├── .gitignore ├── settings.gradle.kts ├── .github └── workflows │ └── ComposeFeaturedBasedMultiModule.yml ├── lint.xml ├── gradle.properties ├── gradlew.bat ├── gradlew └── README.md /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /detail/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /home/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /home/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /list/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /list/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /detail/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /navigation/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /network/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /network/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /navigation/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /core/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /home/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /list/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /detail/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /navigation/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /network/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ComposeFeatureBasedMultiModule 3 | -------------------------------------------------------------------------------- /home/src/main/java/com/example/home/domain/model/CatalogItem.kt: -------------------------------------------------------------------------------- 1 | package com.example.home.domain.model 2 | 3 | data class CatalogItem(val icon: String?, val text: String?) -------------------------------------------------------------------------------- /.idea/kotlinScripting.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /home/src/main/java/com/example/home/domain/model/BannerItem.kt: -------------------------------------------------------------------------------- 1 | package com.example.home.domain.model 2 | 3 | data class BannerItem(val image: String, val navigationData: String) -------------------------------------------------------------------------------- /navigation/src/main/java/com/example/navigation/utils/ArgsScreen.kt: -------------------------------------------------------------------------------- 1 | package com.example.navigation.utils 2 | 3 | interface ArgsScreen : NodeScreen, NavDestination 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basaransuleyman/Compose-FeatureBase-Multi-Module-Clean-Hexagonal-Architecture-Android-Kotlin/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basaransuleyman/Compose-FeatureBase-Multi-Module-Clean-Hexagonal-Architecture-Android-Kotlin/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basaransuleyman/Compose-FeatureBase-Multi-Module-Clean-Hexagonal-Architecture-Android-Kotlin/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /navigation/src/main/java/com/example/navigation/utils/NavigationGraph.kt: -------------------------------------------------------------------------------- 1 | package com.example.navigation.utils 2 | 3 | interface NavigationGraph { 4 | val route: String 5 | val startDestination: String 6 | } -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basaransuleyman/Compose-FeatureBase-Multi-Module-Clean-Hexagonal-Architecture-Android-Kotlin/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basaransuleyman/Compose-FeatureBase-Multi-Module-Clean-Hexagonal-Architecture-Android-Kotlin/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basaransuleyman/Compose-FeatureBase-Multi-Module-Clean-Hexagonal-Architecture-Android-Kotlin/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /core/src/main/java/com/example/core/utils/Constants.kt: -------------------------------------------------------------------------------- 1 | package com.example.core.utils 2 | 3 | object Constants { 4 | const val DEVELOPMENT_MODE = true 5 | const val BASE_URL = "https://raw.githubusercontent.com" 6 | } -------------------------------------------------------------------------------- /core/src/main/java/com/example/core/utils/Qualifiers.kt: -------------------------------------------------------------------------------- 1 | package com.example.core.utils 2 | 3 | import javax.inject.Qualifier 4 | 5 | @Qualifier 6 | @Retention(AnnotationRetention.BINARY) 7 | annotation class IODispatcher 8 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basaransuleyman/Compose-FeatureBase-Multi-Module-Clean-Hexagonal-Architecture-Android-Kotlin/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basaransuleyman/Compose-FeatureBase-Multi-Module-Clean-Hexagonal-Architecture-Android-Kotlin/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basaransuleyman/Compose-FeatureBase-Multi-Module-Clean-Hexagonal-Architecture-Android-Kotlin/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basaransuleyman/Compose-FeatureBase-Multi-Module-Clean-Hexagonal-Architecture-Android-Kotlin/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basaransuleyman/Compose-FeatureBase-Multi-Module-Clean-Hexagonal-Architecture-Android-Kotlin/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /list/src/main/java/com/example/list/presentation/event/ListUIEvent.kt: -------------------------------------------------------------------------------- 1 | package com.example.list.presentation.event 2 | 3 | sealed interface ListUIEvent { 4 | data object Dismiss : ListUIEvent 5 | data object GetList: ListUIEvent 6 | } -------------------------------------------------------------------------------- /navigation/src/main/java/com/example/navigation/screens/Home.kt: -------------------------------------------------------------------------------- 1 | package com.example.navigation.screens 2 | 3 | import com.example.navigation.utils.WithoutArgsScreen 4 | 5 | object Home : WithoutArgsScreen() { 6 | override val route = "home" 7 | } -------------------------------------------------------------------------------- /navigation/src/main/java/com/example/navigation/screens/List.kt: -------------------------------------------------------------------------------- 1 | package com.example.navigation.screens 2 | 3 | import com.example.navigation.utils.WithoutArgsScreen 4 | 5 | object List : WithoutArgsScreen() { 6 | override val route = "list" 7 | } -------------------------------------------------------------------------------- /list/src/main/java/com/example/list/data/api/datasource/ListDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.example.list.data.api.datasource 2 | 3 | import com.example.list.data.api.model.ListResponse 4 | interface ListDataSource { 5 | suspend fun getList(): ListResponse 6 | } -------------------------------------------------------------------------------- /home/src/main/java/com/example/home/data/api/datasource/HomeDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.example.home.data.api.datasource 2 | 3 | import com.example.home.data.api.model.HomeResponse 4 | 5 | interface HomeDataSource { 6 | suspend fun getHome(): HomeResponse 7 | } -------------------------------------------------------------------------------- /navigation/src/main/java/com/example/navigation/utils/NodeScreen.kt: -------------------------------------------------------------------------------- 1 | package com.example.navigation.utils 2 | 3 | import androidx.navigation.NamedNavArgument 4 | 5 | interface NodeScreen { 6 | val route: String 7 | val arguments: List 8 | } -------------------------------------------------------------------------------- /core/src/main/java/com/example/core/model/GenericException.kt: -------------------------------------------------------------------------------- 1 | package com.example.core.model 2 | 3 | import java.io.IOException 4 | 5 | data class GenericException( 6 | override val message: String?, 7 | val hasUserFriendlyMessage: Boolean 8 | ) : IOException() -------------------------------------------------------------------------------- /app/src/main/java/com/example/composefeaturebasedmultimodule/MainApplication.kt: -------------------------------------------------------------------------------- 1 | package com.example.composefeaturebasedmultimodule 2 | 3 | import android.app.Application 4 | import dagger.hilt.android.HiltAndroidApp 5 | 6 | @HiltAndroidApp 7 | class MainApplication: Application() -------------------------------------------------------------------------------- /list/src/main/java/com/example/list/domain/usecase/GetListUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.example.list.domain.usecase 2 | 3 | import com.example.list.domain.model.ListData 4 | import kotlinx.coroutines.flow.Flow 5 | 6 | interface GetListUseCase { 7 | fun getList(): Flow 8 | } -------------------------------------------------------------------------------- /.idea/deploymentTargetDropDown.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Jan 13 16:33:00 TRT 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /detail/src/main/java/com/example/detail/domain/usecase/GetItemDetailUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.example.detail.domain.usecase 2 | 3 | import com.example.detail.domain.model.ItemDetail 4 | import kotlinx.coroutines.flow.Flow 5 | 6 | interface GetItemDetailUseCase { 7 | fun getDetail(): Flow 8 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /core/src/main/java/com/example/core/navigation/NavigationService.kt: -------------------------------------------------------------------------------- 1 | package com.example.core.navigation 2 | 3 | import androidx.navigation.NavOptionsBuilder 4 | 5 | interface NavigationService { 6 | fun navigateTo(destination: String, navOptions: NavOptionsBuilder.() -> Unit = {}) 7 | fun goBack() 8 | } -------------------------------------------------------------------------------- /home/src/main/java/com/example/home/domain/usecase/GetInitialHomeUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.example.home.domain.usecase 2 | 3 | import com.example.home.domain.model.HomeSections 4 | import kotlinx.coroutines.flow.Flow 5 | 6 | interface GetInitialHomeUseCase { 7 | fun getInitialHome(): Flow 8 | } -------------------------------------------------------------------------------- /detail/src/main/java/com/example/detail/data/api/datasource/DetailDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.example.detail.data.api.datasource 2 | 3 | import com.example.detail.data.api.model.ItemDetailResponse 4 | 5 | interface DetailDataSource { 6 | suspend fun getDetail(): ItemDetailResponse 7 | } 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/migrations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /detail/src/main/java/com/example/detail/presentation/uievent/DetailUIEvent.kt: -------------------------------------------------------------------------------- 1 | package com.example.detail.presentation.uievent 2 | 3 | sealed class DetailUIEvent { 4 | data object Dismiss : DetailUIEvent() 5 | data object LoadItemDetail : DetailUIEvent() 6 | data object SearchDetailClick: DetailUIEvent() 7 | 8 | } -------------------------------------------------------------------------------- /navigation/src/main/java/com/example/navigation/Destination.kt: -------------------------------------------------------------------------------- 1 | package com.example.navigation 2 | 3 | import com.example.navigation.screens.Detail 4 | import com.example.navigation.screens.Home 5 | import com.example.navigation.screens.List 6 | 7 | object Destination { 8 | val home = Home 9 | val list = List 10 | val detail = Detail 11 | } -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /navigation/src/main/java/com/example/navigation/utils/NavigationDestination.kt: -------------------------------------------------------------------------------- 1 | package com.example.navigation.utils 2 | 3 | import androidx.navigation.NavBackStackEntry 4 | 5 | interface NavDestination { 6 | fun destination(arg: Arg): DestinationRoute 7 | fun objectParser(entry: NavBackStackEntry): Arg 8 | } 9 | typealias DestinationRoute = String 10 | -------------------------------------------------------------------------------- /list/src/main/java/com/example/list/presentation/state/ListUIState.kt: -------------------------------------------------------------------------------- 1 | package com.example.list.presentation.state 2 | 3 | import androidx.compose.runtime.Immutable 4 | import com.example.list.domain.model.ListData 5 | 6 | @Immutable 7 | data class ListUIState( 8 | val listData: ListData?, 9 | val isLoading: Boolean = false, 10 | val error: Throwable? = null 11 | ) -------------------------------------------------------------------------------- /home/src/main/java/com/example/home/data/api/HomeApi.kt: -------------------------------------------------------------------------------- 1 | package com.example.home.data.api 2 | 3 | import com.example.home.data.api.model.HomeResponse 4 | import retrofit2.Response 5 | import retrofit2.http.GET 6 | 7 | interface HomeApi { 8 | 9 | @GET("/basaransuleyman/suleyman-basaranoglu-json/main/home") 10 | suspend fun getHome(): Response 11 | 12 | } -------------------------------------------------------------------------------- /detail/src/main/java/com/example/detail/presentation/state/DetailUIState.kt: -------------------------------------------------------------------------------- 1 | package com.example.detail.presentation.state 2 | 3 | import androidx.compose.runtime.Immutable 4 | import com.example.detail.domain.model.ItemDetail 5 | 6 | @Immutable 7 | data class DetailUIState( 8 | val itemData: ItemDetail?, 9 | val isLoading: Boolean = false, 10 | val error: Throwable? = null 11 | ) -------------------------------------------------------------------------------- /list/src/main/java/com/example/list/data/api/ListApi.kt: -------------------------------------------------------------------------------- 1 | package com.example.list.data.api 2 | 3 | import com.example.list.data.api.model.ListResponse 4 | import retrofit2.Response 5 | import retrofit2.http.GET 6 | 7 | interface ListApi { 8 | 9 | @GET("/basaransuleyman/suleyman-basaranoglu-json/main/list-page-paging-first") 10 | suspend fun getList() : Response 11 | 12 | } -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /detail/src/main/java/com/example/detail/data/api/DetailApi.kt: -------------------------------------------------------------------------------- 1 | package com.example.detail.data.api 2 | 3 | import com.example.detail.data.api.model.ItemDetailResponse 4 | import retrofit2.Response 5 | import retrofit2.http.GET 6 | 7 | interface DetailApi { 8 | @GET("/basaransuleyman/suleyman-basaranoglu-json/main/detail-page") 9 | suspend fun getDetail(): Response 10 | } -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/composefeaturebasedmultimodule/ui/theme/Color.kt: -------------------------------------------------------------------------------- 1 | package com.example.composefeaturebasedmultimodule.ui.theme 2 | 3 | import androidx.compose.ui.graphics.Color 4 | 5 | val Purple80 = Color(0xFFD0BCFF) 6 | val PurpleGrey80 = Color(0xFFCCC2DC) 7 | val Pink80 = Color(0xFFEFB8C8) 8 | 9 | val Purple40 = Color(0xFF6650a4) 10 | val PurpleGrey40 = Color(0xFF625b71) 11 | val Pink40 = Color(0xFF7D5260) -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /home/src/main/java/com/example/home/domain/model/ProductItem.kt: -------------------------------------------------------------------------------- 1 | package com.example.home.domain.model 2 | 3 | data class ProductItem( 4 | val productId: String, 5 | val productImage: String, 6 | val text: String?, 7 | val subText: String?, 8 | val review: String?, 9 | val questions: String?, 10 | val rating: String?, 11 | val share: String?, 12 | val piece: String?, 13 | val soldOutText:String? 14 | ) 15 | -------------------------------------------------------------------------------- /home/src/main/java/com/example/home/presentation/components/HomeScreenContent.kt: -------------------------------------------------------------------------------- 1 | package com.example.home.presentation.components 2 | 3 | import androidx.compose.runtime.Composable 4 | import com.example.home.domain.model.HomeSections 5 | import com.example.home.presentation.uievent.HomeUIEvent 6 | 7 | @Composable 8 | fun HomeScreenContent(homeData: HomeSections, onEvent: (HomeUIEvent) -> Unit) { 9 | SectionList(homeData.sections, onEvent) 10 | } -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 |