diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index b43063c..4e7084c 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -13,6 +13,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/icon.png b/.idea/icon.png
new file mode 100644
index 0000000..b2237ef
Binary files /dev/null and b/.idea/icon.png differ
diff --git a/.idea/icon_dark.png b/.idea/icon_dark.png
new file mode 100644
index 0000000..e6d5dd8
Binary files /dev/null and b/.idea/icon_dark.png differ
diff --git a/app/src/main/java/com/songlib/MainActivity.kt b/app/src/main/java/com/songlib/MainActivity.kt
index 0347317..6bac76a 100644
--- a/app/src/main/java/com/songlib/MainActivity.kt
+++ b/app/src/main/java/com/songlib/MainActivity.kt
@@ -1,24 +1,20 @@
package com.songlib
-import android.os.*
-import androidx.activity.*
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
-import androidx.annotation.*
-import androidx.compose.foundation.*
-import androidx.compose.ui.*
+import androidx.compose.foundation.isSystemInDarkTheme
import androidx.hilt.navigation.compose.hiltViewModel
-import com.songlib.domain.repos.ThemeMode
-import com.songlib.domain.repos.ThemeRepository
-import com.songlib.presentation.navigation.*
-import com.songlib.presentation.theme.*
+import com.songlib.app.navigation.AppNavHost
+import com.songlib.core.data.repos.ThemeRepository
+import com.songlib.core.data.repos.ThemeMode
+import com.songlib.core.designsystem.theme.AppTheme
import dagger.hilt.android.AndroidEntryPoint
-@ExperimentalComposeUiApi
-@ExperimentalFoundationApi
-@Keep
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
- @RequiresApi(Build.VERSION_CODES.S)
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -36,4 +32,4 @@ class MainActivity : ComponentActivity() {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/songlib/SongLibApp.kt b/app/src/main/java/com/songlib/SongLibApp.kt
index 7f6dd3c..d4b95d7 100644
--- a/app/src/main/java/com/songlib/SongLibApp.kt
+++ b/app/src/main/java/com/songlib/SongLibApp.kt
@@ -4,7 +4,6 @@ import android.app.Application
import com.revenuecat.purchases.Purchases
import com.revenuecat.purchases.PurchasesConfiguration
import dagger.hilt.android.HiltAndroidApp
-//import io.sentry.android.core.SentryAndroid
@HiltAndroidApp
class SongLibApp : Application() {
@@ -12,15 +11,11 @@ class SongLibApp : Application() {
override fun onCreate() {
super.onCreate()
- Purchases.configure(
- PurchasesConfiguration.Builder(this, BuildConfig.RcApiKey)
- .build()
- )
-
-// SentryAndroid.init(this) { options ->
-// options.dsn = BuildConfig.SentryDsn
-// options.tracesSampleRate = 1.0
-// options.isDebug = false
-// }
+ if (!BuildConfig.DEBUG) {
+ Purchases.configure(
+ PurchasesConfiguration.Builder(this, BuildConfig.RcApiKey)
+ .build()
+ )
+ }
}
}
diff --git a/app/src/main/java/com/songlib/presentation/navigation/AppNavHost.kt b/app/src/main/java/com/songlib/app/navigation/AppNavHost.kt
similarity index 74%
rename from app/src/main/java/com/songlib/presentation/navigation/AppNavHost.kt
rename to app/src/main/java/com/songlib/app/navigation/AppNavHost.kt
index 72a197f..3d86ce7 100644
--- a/app/src/main/java/com/songlib/presentation/navigation/AppNavHost.kt
+++ b/app/src/main/java/com/songlib/app/navigation/AppNavHost.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.navigation
+package com.songlib.app.navigation
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.runtime.*
@@ -6,20 +6,21 @@ import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.*
import androidx.navigation.compose.*
-import com.songlib.data.models.*
-import com.songlib.domain.repos.ThemeRepository
-import com.songlib.presentation.home.HomeViewModel
-import com.songlib.presentation.home.view.HomeScreen
-import com.songlib.presentation.listing.ListingViewModel
-import com.songlib.presentation.listing.view.ListingScreen
-import com.songlib.presentation.presenter.PresenterViewModel
-import com.songlib.presentation.presenter.view.PresenterScreen
-import com.songlib.presentation.selection.SelectionViewModel
-import com.songlib.presentation.selection.view.SelectionScreen
-import com.songlib.presentation.settings.SettingsViewModel
-import com.songlib.presentation.settings.view.SettingsScreen
-import com.songlib.presentation.splash.SplashViewModel
-import com.songlib.presentation.splash.view.SplashScreen
+import com.songlib.core.database.model.*
+import com.songlib.core.data.repos.ThemeRepository
+import com.songlib.feature.home.HomeViewModel
+import com.songlib.feature.home.view.HomeScreen
+import com.songlib.feature.listing.ListingViewModel
+import com.songlib.feature.listing.view.ListingScreen
+import com.songlib.core.common.utils.Routes
+import com.songlib.feature.presenter.PresenterViewModel
+import com.songlib.feature.presenter.view.PresenterScreen
+import com.songlib.feature.selection.SelectionViewModel
+import com.songlib.feature.selection.view.SelectionScreen
+import com.songlib.feature.settings.SettingsViewModel
+import com.songlib.feature.settings.view.SettingsScreen
+import com.songlib.feature.splash.SplashViewModel
+import com.songlib.feature.splash.view.SplashScreen
@OptIn(ExperimentalComposeUiApi::class, ExperimentalFoundationApi::class)
@Composable
diff --git a/app/src/main/java/com/songlib/presentation/navigation/Routes.kt b/app/src/main/java/com/songlib/presentation/navigation/Routes.kt
deleted file mode 100644
index dca0f51..0000000
--- a/app/src/main/java/com/songlib/presentation/navigation/Routes.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.songlib.presentation.navigation
-
-object Routes {
- const val SPLASH = "splash"
- const val SELECTION = "selection"
- const val HOME = "home"
- const val PRESENTER = "presenter"
- const val LISTING = "listing"
- const val SETTINGS = "settings"
-}
diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts
new file mode 100644
index 0000000..7e8ff06
--- /dev/null
+++ b/build-logic/convention/build.gradle.kts
@@ -0,0 +1,52 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+
+plugins {
+ `kotlin-dsl`
+}
+
+group = "com.songlib.buildlogic"
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+}
+
+kotlin {
+ compilerOptions {
+ jvmTarget = JvmTarget.JVM_17
+ }
+}
+
+dependencies {
+ compileOnly(libs.plugins.android.application.toDep())
+ compileOnly(libs.plugins.android.library.toDep())
+ compileOnly(libs.plugins.kotlin.android.toDep())
+ compileOnly(libs.plugins.kotlin.compose.toDep())
+ compileOnly(libs.plugins.dagger.hilt.toDep())
+ compileOnly(libs.plugins.devtools.ksp.toDep())
+}
+
+fun Provider.toDep() = map {
+ "${it.pluginId}:${it.pluginId}.gradle.plugin:${it.version}"
+}
+
+gradlePlugin {
+ plugins {
+ register("androidLibrary") {
+ id = "songlib.android.library"
+ implementationClass = "AndroidLibraryConventionPlugin"
+ }
+ register("androidLibraryCompose") {
+ id = "songlib.android.library.compose"
+ implementationClass = "AndroidLibraryComposeConventionPlugin"
+ }
+ register("androidFeature") {
+ id = "songlib.android.feature"
+ implementationClass = "AndroidFeatureConventionPlugin"
+ }
+ register("hilt") {
+ id = "songlib.hilt"
+ implementationClass = "HiltConventionPlugin"
+ }
+ }
+}
diff --git a/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt
new file mode 100644
index 0000000..3473c06
--- /dev/null
+++ b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt
@@ -0,0 +1,40 @@
+import com.songlib.libs
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.kotlin.dsl.dependencies
+
+/**
+ * Convention plugin for feature modules.
+ * Applies: android library + compose + hilt.
+ * Adds standard feature dependencies: core:ui, core:common.
+ */
+class AndroidFeatureConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ with(target) {
+ pluginManager.apply("songlib.android.library.compose")
+ pluginManager.apply("songlib.hilt")
+
+ dependencies {
+ "implementation"(project(":core:ui"))
+ "implementation"(project(":core:common"))
+ "implementation"(project(":core:designsystem"))
+
+ "implementation"(libs.findLibrary("androidx.compose.bom").get())
+ "implementation"(libs.findLibrary("androidx.activity.compose").get())
+ "implementation"(libs.findLibrary("androidx.ui").get())
+ "implementation"(libs.findLibrary("androidx.ui.graphics").get())
+
+ "implementation"(libs.findLibrary("androidx.material3").get())
+ "implementation"(libs.findLibrary("androidx.compose.material").get())
+ "implementation"(libs.findLibrary("androidx.icons.extended").get())
+
+ "implementation"(libs.findLibrary("androidx.ui.tooling").get())
+ "implementation"(libs.findLibrary("androidx.foundation").get())
+
+ "implementation"(libs.findLibrary("compose.navigation").get())
+ "implementation"(libs.findLibrary("compose.hilt.navigation").get())
+ "implementation"(libs.findLibrary("androidx.compose.livedata").get())
+ }
+ }
+ }
+}
diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt
new file mode 100644
index 0000000..ad263f8
--- /dev/null
+++ b/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt
@@ -0,0 +1,27 @@
+import com.android.build.gradle.LibraryExtension
+import com.songlib.libs
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.kotlin.dsl.configure
+import org.gradle.kotlin.dsl.dependencies
+
+/**
+ * Applies the base Android library plugin PLUS Compose support.
+ * Feature modules that expose Composables should use this plugin.
+ */
+class AndroidLibraryComposeConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ with(target) {
+ pluginManager.apply("songlib.android.library")
+ pluginManager.apply("org.jetbrains.kotlin.plugin.compose")
+
+ dependencies {
+ "implementation"(libs.findLibrary("androidx.core.ktx").get())
+ "implementation"(libs.findLibrary("androidx.lifecycle.runtime.ktx").get())
+ }
+ extensions.configure {
+ buildFeatures { compose = true }
+ }
+ }
+ }
+}
diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt
new file mode 100644
index 0000000..f9f7693
--- /dev/null
+++ b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt
@@ -0,0 +1,33 @@
+import com.android.build.gradle.LibraryExtension
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.kotlin.dsl.configure
+
+class AndroidLibraryConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ with(target) {
+ with(pluginManager) {
+ apply("com.android.library")
+ apply("org.jetbrains.kotlin.android")
+ }
+ extensions.configure {
+ compileSdk = 35
+ defaultConfig {
+ minSdk = 26
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ }
+ compileOptions {
+ sourceCompatibility = org.gradle.api.JavaVersion.VERSION_11
+ targetCompatibility = org.gradle.api.JavaVersion.VERSION_11
+ }
+ kotlinOptions { jvmTarget = "11" }
+ }
+ }
+ }
+
+ // Extension function kept here for brevity; in real projects extract to a separate file
+ private fun LibraryExtension.kotlinOptions(block: org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions.() -> Unit) {
+ (this as org.gradle.api.plugins.ExtensionAware).extensions
+ .configure("kotlinOptions", block)
+ }
+}
diff --git a/build-logic/convention/src/main/kotlin/HiltConventionPlugin.kt b/build-logic/convention/src/main/kotlin/HiltConventionPlugin.kt
new file mode 100644
index 0000000..d1ebf71
--- /dev/null
+++ b/build-logic/convention/src/main/kotlin/HiltConventionPlugin.kt
@@ -0,0 +1,17 @@
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.kotlin.dsl.dependencies
+
+class HiltConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ with(target) {
+ pluginManager.apply("com.google.dagger.hilt.android")
+ pluginManager.apply("com.google.devtools.ksp")
+
+ dependencies {
+ add("implementation", "com.google.dagger:hilt-android:2.57.2")
+ add("ksp", "com.google.dagger:hilt-compiler:2.57.2")
+ }
+ }
+ }
+}
diff --git a/build-logic/convention/src/main/kotlin/com/songlib/ProjectExtensions.kt b/build-logic/convention/src/main/kotlin/com/songlib/ProjectExtensions.kt
new file mode 100644
index 0000000..c785fff
--- /dev/null
+++ b/build-logic/convention/src/main/kotlin/com/songlib/ProjectExtensions.kt
@@ -0,0 +1,9 @@
+package com.songlib
+
+import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalog
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.kotlin.dsl.getByType
+
+val Project.libs
+ get(): VersionCatalog = extensions.getByType().named("libs")
diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts
new file mode 100644
index 0000000..f26e6d9
--- /dev/null
+++ b/build-logic/settings.gradle.kts
@@ -0,0 +1,15 @@
+dependencyResolutionManagement {
+ repositories {
+ google()
+ mavenCentral()
+ }
+ versionCatalogs {
+ create("libs") {
+ from(files("../gradle/libs.versions.toml"))
+ }
+ }
+}
+
+rootProject.name = "build-logic"
+
+include(":convention")
diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts
new file mode 100644
index 0000000..d317bfa
--- /dev/null
+++ b/core/common/build.gradle.kts
@@ -0,0 +1,13 @@
+plugins {
+ alias(libs.plugins.songlib.android.library)
+}
+
+android {
+ namespace = "com.songlib.core.common"
+}
+
+dependencies {
+ implementation(libs.androidx.core.ktx)
+ implementation(libs.ktor.client.android)
+ implementation(libs.revenuecat)
+}
diff --git a/core/common/src/main/AndroidManifest.xml b/core/common/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f0f34af
--- /dev/null
+++ b/core/common/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/songlib/domain/entity/Basics.kt b/core/common/src/main/java/com/songlib/core/common/entity/Basics.kt
similarity index 67%
rename from app/src/main/java/com/songlib/domain/entity/Basics.kt
rename to core/common/src/main/java/com/songlib/core/common/entity/Basics.kt
index e439c02..5b0fc88 100644
--- a/app/src/main/java/com/songlib/domain/entity/Basics.kt
+++ b/core/common/src/main/java/com/songlib/core/common/entity/Basics.kt
@@ -1,4 +1,4 @@
-package com.songlib.domain.entity
+package com.songlib.core.common.entity
data class Selectable(
val data: T,
diff --git a/app/src/main/java/com/songlib/domain/entity/UiState.kt b/core/common/src/main/java/com/songlib/core/common/entity/UiState.kt
similarity index 93%
rename from app/src/main/java/com/songlib/domain/entity/UiState.kt
rename to core/common/src/main/java/com/songlib/core/common/entity/UiState.kt
index 9c47c42..2de8492 100644
--- a/app/src/main/java/com/songlib/domain/entity/UiState.kt
+++ b/core/common/src/main/java/com/songlib/core/common/entity/UiState.kt
@@ -1,4 +1,4 @@
-package com.songlib.domain.entity
+package com.songlib.core.common.entity
sealed class UiState {
object Idle : UiState()
diff --git a/app/src/main/java/com/songlib/core/helpers/NetworkHelpers.kt b/core/common/src/main/java/com/songlib/core/common/helpers/NetworkHelpers.kt
similarity index 97%
rename from app/src/main/java/com/songlib/core/helpers/NetworkHelpers.kt
rename to core/common/src/main/java/com/songlib/core/common/helpers/NetworkHelpers.kt
index 7fa6582..de3acb0 100644
--- a/app/src/main/java/com/songlib/core/helpers/NetworkHelpers.kt
+++ b/core/common/src/main/java/com/songlib/core/common/helpers/NetworkHelpers.kt
@@ -1,4 +1,4 @@
-package com.songlib.core.helpers
+package com.songlib.core.common.helpers
import android.content.Context
import android.net.*
diff --git a/app/src/main/java/com/songlib/core/utils/AppConstants.kt b/core/common/src/main/java/com/songlib/core/common/utils/AppConstants.kt
similarity index 78%
rename from app/src/main/java/com/songlib/core/utils/AppConstants.kt
rename to core/common/src/main/java/com/songlib/core/common/utils/AppConstants.kt
index c4e01d0..a0eee3a 100644
--- a/app/src/main/java/com/songlib/core/utils/AppConstants.kt
+++ b/core/common/src/main/java/com/songlib/core/common/utils/AppConstants.kt
@@ -1,4 +1,4 @@
-package com.songlib.core.utils
+package com.songlib.core.common.utils
object ApiConstants {
const val BASE = "https://songlive.vercel.app/"
@@ -30,4 +30,13 @@ object PrefConstants {
const val THEME_MODE = "themeMode"
const val HORIZONTAL_SLIDES = "horizontalSlides"
const val LAST_APP_OPEN_TIME = "lastAppOpenTime"
-}
\ No newline at end of file
+}
+
+object Routes {
+ const val SPLASH = "splash"
+ const val SELECTION = "selection"
+ const val HOME = "home"
+ const val PRESENTER = "presenter"
+ const val LISTING = "listing"
+ const val SETTINGS = "settings"
+}
diff --git a/app/src/main/java/com/songlib/core/utils/AppUtil.kt b/core/common/src/main/java/com/songlib/core/common/utils/AppUtil.kt
similarity index 97%
rename from app/src/main/java/com/songlib/core/utils/AppUtil.kt
rename to core/common/src/main/java/com/songlib/core/common/utils/AppUtil.kt
index ac24692..7ec7241 100644
--- a/app/src/main/java/com/songlib/core/utils/AppUtil.kt
+++ b/core/common/src/main/java/com/songlib/core/common/utils/AppUtil.kt
@@ -1,4 +1,4 @@
-package com.songlib.core.utils
+package com.songlib.core.common.utils
fun refineTitle(textTitle: String): String {
return textTitle.replace("''", "'")
diff --git a/app/src/main/java/com/songlib/core/utils/SongUtils.kt b/core/common/src/main/java/com/songlib/core/common/utils/SongUtils.kt
similarity index 93%
rename from app/src/main/java/com/songlib/core/utils/SongUtils.kt
rename to core/common/src/main/java/com/songlib/core/common/utils/SongUtils.kt
index 2812664..60f6291 100644
--- a/app/src/main/java/com/songlib/core/utils/SongUtils.kt
+++ b/core/common/src/main/java/com/songlib/core/common/utils/SongUtils.kt
@@ -1,6 +1,6 @@
-package com.songlib.core.utils
+package com.songlib.core.common.utils
-import com.songlib.data.models.Song
+import com.songlib.core.database.model.Song
object SongUtils {
diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts
new file mode 100644
index 0000000..b3fa164
--- /dev/null
+++ b/core/data/build.gradle.kts
@@ -0,0 +1,21 @@
+plugins {
+ alias(libs.plugins.songlib.android.library)
+ alias(libs.plugins.songlib.hilt)
+}
+
+android {
+ namespace = "com.songlib.core.data"
+}
+
+dependencies {
+ api(project(":core:database"))
+ api(project(":core:network"))
+ implementation(project(":core:common"))
+
+ api(libs.androidx.compose.material)
+
+ implementation(platform(libs.jan.tennert.supabase.bom))
+ implementation(libs.jan.tennert.supabase.postgrest)
+ implementation(libs.androidx.core.ktx)
+ implementation(libs.revenuecat)
+}
diff --git a/app/src/main/java/com/songlib/core/di/AppModule.kt b/core/data/src/main/java/com/songlib/core/data/di/DataModule.kt
similarity index 73%
rename from app/src/main/java/com/songlib/core/di/AppModule.kt
rename to core/data/src/main/java/com/songlib/core/data/di/DataModule.kt
index afe6373..bd116b2 100644
--- a/app/src/main/java/com/songlib/core/di/AppModule.kt
+++ b/core/data/src/main/java/com/songlib/core/data/di/DataModule.kt
@@ -1,13 +1,14 @@
-package com.songlib.core.di
+package com.songlib.core.data.di
import android.content.Context
-import com.songlib.data.sources.remote.ApiService
-import com.songlib.domain.repos.ListingRepo
-import com.songlib.domain.repos.PrefsRepo
-import com.songlib.domain.repos.SongBookRepo
-import com.songlib.domain.repos.SubsRepo
-import com.songlib.domain.repos.ThemeRepository
-import com.songlib.domain.repos.TrackingRepo
+import com.songlib.core.network.ApiService
+import com.songlib.core.network.di.NetworkModule
+import com.songlib.core.data.repos.ListingRepo
+import com.songlib.core.data.repos.PrefsRepo
+import com.songlib.core.data.repos.SongBookRepo
+import com.songlib.core.data.repos.SubsRepo
+import com.songlib.core.data.repos.ThemeRepository
+import com.songlib.core.data.repos.TrackingRepo
import dagger.*
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
@@ -16,7 +17,8 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
@Module(includes = [NetworkModule::class])
-class AppModule {
+object DataModule {
+
@Provides
@Singleton
fun provideListingRepository(
@@ -52,4 +54,4 @@ class AppModule {
fun provideTrackingRepository(
@ApplicationContext context: Context,
): TrackingRepo = TrackingRepo(context)
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/songlib/domain/repos/ListingRepo.kt b/core/data/src/main/java/com/songlib/core/data/repos/ListingRepo.kt
similarity index 93%
rename from app/src/main/java/com/songlib/domain/repos/ListingRepo.kt
rename to core/data/src/main/java/com/songlib/core/data/repos/ListingRepo.kt
index 1458f48..0dcfca6 100644
--- a/app/src/main/java/com/songlib/domain/repos/ListingRepo.kt
+++ b/core/data/src/main/java/com/songlib/core/data/repos/ListingRepo.kt
@@ -1,10 +1,10 @@
-package com.songlib.domain.repos
+package com.songlib.core.data.repos
import android.content.*
-import com.songlib.core.utils.toTimeAgo
-import com.songlib.data.models.*
-import com.songlib.data.sources.local.*
-import com.songlib.data.sources.local.daos.*
+import com.songlib.core.common.utils.toTimeAgo
+import com.songlib.core.database.model.*
+import com.songlib.core.database.*
+import com.songlib.core.database.daos.*
import kotlinx.coroutines.*
import javax.inject.*
diff --git a/app/src/main/java/com/songlib/domain/repos/PrefsRepo.kt b/core/data/src/main/java/com/songlib/core/data/repos/PrefsRepo.kt
similarity index 96%
rename from app/src/main/java/com/songlib/domain/repos/PrefsRepo.kt
rename to core/data/src/main/java/com/songlib/core/data/repos/PrefsRepo.kt
index 7701e6a..832c39f 100644
--- a/app/src/main/java/com/songlib/domain/repos/PrefsRepo.kt
+++ b/core/data/src/main/java/com/songlib/core/data/repos/PrefsRepo.kt
@@ -1,7 +1,7 @@
-package com.songlib.domain.repos
+package com.songlib.core.data.repos
import android.content.Context
-import com.songlib.core.utils.PrefConstants
+import com.songlib.core.common.utils.PrefConstants
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.*
import androidx.core.content.edit
diff --git a/app/src/main/java/com/songlib/domain/repos/SongBookRepo.kt b/core/data/src/main/java/com/songlib/core/data/repos/SongBookRepo.kt
similarity index 94%
rename from app/src/main/java/com/songlib/domain/repos/SongBookRepo.kt
rename to core/data/src/main/java/com/songlib/core/data/repos/SongBookRepo.kt
index 7221a20..170f937 100644
--- a/app/src/main/java/com/songlib/domain/repos/SongBookRepo.kt
+++ b/core/data/src/main/java/com/songlib/core/data/repos/SongBookRepo.kt
@@ -1,11 +1,11 @@
-package com.songlib.domain.repos
+package com.songlib.core.data.repos
import android.content.*
import android.util.Log
-import com.songlib.data.models.*
-import com.songlib.data.sources.local.*
-import com.songlib.data.sources.local.daos.*
-import com.songlib.data.sources.remote.ApiService
+import com.songlib.core.database.model.*
+import com.songlib.core.database.*
+import com.songlib.core.database.daos.*
+import com.songlib.core.network.ApiService
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import javax.inject.*
diff --git a/app/src/main/java/com/songlib/domain/repos/SubsRepo.kt b/core/data/src/main/java/com/songlib/core/data/repos/SubsRepo.kt
similarity index 95%
rename from app/src/main/java/com/songlib/domain/repos/SubsRepo.kt
rename to core/data/src/main/java/com/songlib/core/data/repos/SubsRepo.kt
index d170560..e20d787 100644
--- a/app/src/main/java/com/songlib/domain/repos/SubsRepo.kt
+++ b/core/data/src/main/java/com/songlib/core/data/repos/SubsRepo.kt
@@ -1,4 +1,4 @@
-package com.songlib.domain.repos
+package com.songlib.core.data.repos
import com.revenuecat.purchases.*
import javax.inject.*
diff --git a/app/src/main/java/com/songlib/domain/repos/ThemeRepo.kt b/core/data/src/main/java/com/songlib/core/data/repos/ThemeRepo.kt
similarity index 98%
rename from app/src/main/java/com/songlib/domain/repos/ThemeRepo.kt
rename to core/data/src/main/java/com/songlib/core/data/repos/ThemeRepo.kt
index 93b3ea4..b65b72b 100644
--- a/app/src/main/java/com/songlib/domain/repos/ThemeRepo.kt
+++ b/core/data/src/main/java/com/songlib/core/data/repos/ThemeRepo.kt
@@ -1,4 +1,4 @@
-package com.songlib.domain.repos
+package com.songlib.core.data.repos
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
diff --git a/app/src/main/java/com/songlib/domain/repos/TrackingRepo.kt b/core/data/src/main/java/com/songlib/core/data/repos/TrackingRepo.kt
similarity index 92%
rename from app/src/main/java/com/songlib/domain/repos/TrackingRepo.kt
rename to core/data/src/main/java/com/songlib/core/data/repos/TrackingRepo.kt
index 7056819..7e8efda 100644
--- a/app/src/main/java/com/songlib/domain/repos/TrackingRepo.kt
+++ b/core/data/src/main/java/com/songlib/core/data/repos/TrackingRepo.kt
@@ -1,9 +1,9 @@
-package com.songlib.domain.repos
+package com.songlib.core.data.repos
import android.content.*
-import com.songlib.data.models.*
-import com.songlib.data.sources.local.*
-import com.songlib.data.sources.local.daos.*
+import com.songlib.core.database.model.*
+import com.songlib.core.database.*
+import com.songlib.core.database.daos.*
import kotlinx.coroutines.*
import javax.inject.*
diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts
new file mode 100644
index 0000000..b0230be
--- /dev/null
+++ b/core/database/build.gradle.kts
@@ -0,0 +1,15 @@
+plugins {
+ alias(libs.plugins.songlib.android.library)
+ alias(libs.plugins.songlib.hilt)
+ alias(libs.plugins.devtools.ksp)
+ id("kotlin-parcelize")
+}
+
+android {
+ namespace = "com.songlib.core.database"
+}
+
+dependencies {
+ implementation(libs.androidx.room.runtime)
+ ksp(libs.androidx.room.compiler)
+}
diff --git a/app/src/main/java/com/songlib/data/sources/local/AppDatabase.kt b/core/database/src/main/java/com/songlib/core/database/AppDatabase.kt
similarity index 90%
rename from app/src/main/java/com/songlib/data/sources/local/AppDatabase.kt
rename to core/database/src/main/java/com/songlib/core/database/AppDatabase.kt
index 12bba16..3075d50 100644
--- a/app/src/main/java/com/songlib/data/sources/local/AppDatabase.kt
+++ b/core/database/src/main/java/com/songlib/core/database/AppDatabase.kt
@@ -1,9 +1,9 @@
-package com.songlib.data.sources.local
+package com.songlib.core.database
import android.content.Context
import androidx.room.*
-import com.songlib.data.models.*
-import com.songlib.data.sources.local.daos.*
+import com.songlib.core.database.model.*
+import com.songlib.core.database.daos.*
@Database(
entities = [Book::class, History::class, Listing::class, Search::class, Song::class],
diff --git a/app/src/main/java/com/songlib/data/sources/local/daos/BookDao.kt b/core/database/src/main/java/com/songlib/core/database/daos/BookDao.kt
similarity index 81%
rename from app/src/main/java/com/songlib/data/sources/local/daos/BookDao.kt
rename to core/database/src/main/java/com/songlib/core/database/daos/BookDao.kt
index d8d1e0d..e1618f6 100644
--- a/app/src/main/java/com/songlib/data/sources/local/daos/BookDao.kt
+++ b/core/database/src/main/java/com/songlib/core/database/daos/BookDao.kt
@@ -1,8 +1,8 @@
-package com.songlib.data.sources.local.daos
+package com.songlib.core.database.daos
import androidx.room.*
-import com.songlib.core.utils.DbConstants
-import com.songlib.data.models.Book
+import com.songlib.core.common.utils.DbConstants
+import com.songlib.core.database.model.Book
@Dao
interface BookDao {
diff --git a/app/src/main/java/com/songlib/data/sources/local/daos/HistoryDao.kt b/core/database/src/main/java/com/songlib/core/database/daos/HistoryDao.kt
similarity index 79%
rename from app/src/main/java/com/songlib/data/sources/local/daos/HistoryDao.kt
rename to core/database/src/main/java/com/songlib/core/database/daos/HistoryDao.kt
index 1ad2d27..6b910ca 100644
--- a/app/src/main/java/com/songlib/data/sources/local/daos/HistoryDao.kt
+++ b/core/database/src/main/java/com/songlib/core/database/daos/HistoryDao.kt
@@ -1,8 +1,8 @@
-package com.songlib.data.sources.local.daos
+package com.songlib.core.database.daos
import androidx.room.*
-import com.songlib.core.utils.DbConstants
-import com.songlib.data.models.History
+import com.songlib.core.common.utils.DbConstants
+import com.songlib.core.database.model.History
@Dao
interface HistoryDao {
diff --git a/app/src/main/java/com/songlib/data/sources/local/daos/ListingDao.kt b/core/database/src/main/java/com/songlib/core/database/daos/ListingDao.kt
similarity index 83%
rename from app/src/main/java/com/songlib/data/sources/local/daos/ListingDao.kt
rename to core/database/src/main/java/com/songlib/core/database/daos/ListingDao.kt
index 0c01250..5dce90d 100644
--- a/app/src/main/java/com/songlib/data/sources/local/daos/ListingDao.kt
+++ b/core/database/src/main/java/com/songlib/core/database/daos/ListingDao.kt
@@ -1,8 +1,8 @@
-package com.songlib.data.sources.local.daos
+package com.songlib.core.database.daos
import androidx.room.*
-import com.songlib.core.utils.DbConstants
-import com.songlib.data.models.Listing
+import com.songlib.core.common.utils.DbConstants
+import com.songlib.core.database.model.Listing
@Dao
interface ListingDao {
diff --git a/app/src/main/java/com/songlib/data/sources/local/daos/SearchDao.kt b/core/database/src/main/java/com/songlib/core/database/daos/SearchDao.kt
similarity index 78%
rename from app/src/main/java/com/songlib/data/sources/local/daos/SearchDao.kt
rename to core/database/src/main/java/com/songlib/core/database/daos/SearchDao.kt
index cd42f33..c32be59 100644
--- a/app/src/main/java/com/songlib/data/sources/local/daos/SearchDao.kt
+++ b/core/database/src/main/java/com/songlib/core/database/daos/SearchDao.kt
@@ -1,8 +1,8 @@
-package com.songlib.data.sources.local.daos
+package com.songlib.core.database.daos
import androidx.room.*
-import com.songlib.core.utils.DbConstants
-import com.songlib.data.models.Search
+import com.songlib.core.common.utils.DbConstants
+import com.songlib.core.database.model.Search
@Dao
interface SearchDao {
diff --git a/app/src/main/java/com/songlib/data/sources/local/daos/SongDao.kt b/core/database/src/main/java/com/songlib/core/database/daos/SongDao.kt
similarity index 84%
rename from app/src/main/java/com/songlib/data/sources/local/daos/SongDao.kt
rename to core/database/src/main/java/com/songlib/core/database/daos/SongDao.kt
index c39feef..191d078 100644
--- a/app/src/main/java/com/songlib/data/sources/local/daos/SongDao.kt
+++ b/core/database/src/main/java/com/songlib/core/database/daos/SongDao.kt
@@ -1,8 +1,8 @@
-package com.songlib.data.sources.local.daos
+package com.songlib.core.database.daos
import androidx.room.*
-import com.songlib.core.utils.DbConstants
-import com.songlib.data.models.Song
+import com.songlib.core.common.utils.DbConstants
+import com.songlib.core.database.model.Song
@Dao
interface SongDao {
diff --git a/core/database/src/main/java/com/songlib/core/database/di/DatabaseModule.kt b/core/database/src/main/java/com/songlib/core/database/di/DatabaseModule.kt
new file mode 100644
index 0000000..9aa9e5f
--- /dev/null
+++ b/core/database/src/main/java/com/songlib/core/database/di/DatabaseModule.kt
@@ -0,0 +1,36 @@
+package com.songlib.core.database.di
+
+import android.content.Context
+import androidx.room.Room
+import com.songlib.core.database.AppDatabase
+import com.songlib.core.database.daos.HistoryDao
+import com.songlib.core.database.daos.IdiomDao
+import com.songlib.core.database.daos.ProverbDao
+import com.songlib.core.database.daos.SayingDao
+import com.songlib.core.database.daos.SearchDao
+import com.songlib.core.database.daos.WordDao
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.android.qualifiers.ApplicationContext
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+@InstallIn(SingletonComponent::class)
+@Module
+object DatabaseModule {
+
+ @Provides
+ @Singleton
+ fun provideDatabase(@ApplicationContext appContext: Context): AppDatabase =
+ Room.databaseBuilder(appContext, AppDatabase::class.java, "SwahiliLibrary")
+ .fallbackToDestructiveMigration()
+ .build()
+
+ @Provides fun provideHistoryDao(db: AppDatabase): HistoryDao = db.historiesDao()
+ @Provides fun provideIdiomDao(db: AppDatabase): IdiomDao = db.idiomsDao()
+ @Provides fun provideProverbDao(db: AppDatabase): ProverbDao = db.proverbsDao()
+ @Provides fun provideSayingDao(db: AppDatabase): SayingDao = db.sayingsDao()
+ @Provides fun provideSearchDao(db: AppDatabase): SearchDao = db.searchesDao()
+ @Provides fun provideWordDao(db: AppDatabase): WordDao = db.wordsDao()
+}
diff --git a/app/src/main/java/com/songlib/data/models/Book.kt b/core/database/src/main/java/com/songlib/core/database/model/Book.kt
similarity index 88%
rename from app/src/main/java/com/songlib/data/models/Book.kt
rename to core/database/src/main/java/com/songlib/core/database/model/Book.kt
index bb69569..2d60faf 100644
--- a/app/src/main/java/com/songlib/data/models/Book.kt
+++ b/core/database/src/main/java/com/songlib/core/database/model/Book.kt
@@ -1,9 +1,9 @@
-package com.songlib.data.models
+package com.songlib.core.database.model
import android.os.Parcelable
import androidx.annotation.Keep
import androidx.room.*
-import com.songlib.core.utils.DbConstants
+import com.songlib.core.common.utils.DbConstants
import kotlinx.parcelize.Parcelize
@Keep
diff --git a/app/src/main/java/com/songlib/data/models/History.kt b/core/database/src/main/java/com/songlib/core/database/model/History.kt
similarity index 76%
rename from app/src/main/java/com/songlib/data/models/History.kt
rename to core/database/src/main/java/com/songlib/core/database/model/History.kt
index 5674b00..94cc833 100644
--- a/app/src/main/java/com/songlib/data/models/History.kt
+++ b/core/database/src/main/java/com/songlib/core/database/model/History.kt
@@ -1,8 +1,8 @@
-package com.songlib.data.models
+package com.songlib.core.database.model
import androidx.annotation.Keep
import androidx.room.*
-import com.songlib.core.utils.DbConstants
+import com.songlib.core.common.utils.DbConstants
@Keep
@Entity(tableName = DbConstants.HISTORIES)
diff --git a/app/src/main/java/com/songlib/data/models/Listing.kt b/core/database/src/main/java/com/songlib/core/database/model/Listing.kt
similarity index 86%
rename from app/src/main/java/com/songlib/data/models/Listing.kt
rename to core/database/src/main/java/com/songlib/core/database/model/Listing.kt
index f99cc25..ba70272 100644
--- a/app/src/main/java/com/songlib/data/models/Listing.kt
+++ b/core/database/src/main/java/com/songlib/core/database/model/Listing.kt
@@ -1,9 +1,9 @@
-package com.songlib.data.models
+package com.songlib.core.database.model
import android.os.Parcelable
import androidx.annotation.Keep
import androidx.room.*
-import com.songlib.core.utils.DbConstants
+import com.songlib.core.common.utils.DbConstants
import kotlinx.parcelize.Parcelize
@Keep
diff --git a/app/src/main/java/com/songlib/data/models/Search.kt b/core/database/src/main/java/com/songlib/core/database/model/Search.kt
similarity index 77%
rename from app/src/main/java/com/songlib/data/models/Search.kt
rename to core/database/src/main/java/com/songlib/core/database/model/Search.kt
index 775198a..6d0ad1a 100644
--- a/app/src/main/java/com/songlib/data/models/Search.kt
+++ b/core/database/src/main/java/com/songlib/core/database/model/Search.kt
@@ -1,8 +1,8 @@
-package com.songlib.data.models
+package com.songlib.core.database.model
import androidx.annotation.Keep
import androidx.room.*
-import com.songlib.core.utils.DbConstants
+import com.songlib.core.common.utils.DbConstants
import java.util.Date
@Keep
diff --git a/app/src/main/java/com/songlib/data/models/Song.kt b/core/database/src/main/java/com/songlib/core/database/model/Song.kt
similarity index 89%
rename from app/src/main/java/com/songlib/data/models/Song.kt
rename to core/database/src/main/java/com/songlib/core/database/model/Song.kt
index e81d341..5103ba9 100644
--- a/app/src/main/java/com/songlib/data/models/Song.kt
+++ b/core/database/src/main/java/com/songlib/core/database/model/Song.kt
@@ -1,9 +1,9 @@
-package com.songlib.data.models
+package com.songlib.core.database.model
import android.os.Parcelable
import androidx.annotation.Keep
import androidx.room.*
-import com.songlib.core.utils.DbConstants
+import com.songlib.core.common.utils.DbConstants
import kotlinx.parcelize.Parcelize
@Keep
diff --git a/core/designsystem/build.gradle.kts b/core/designsystem/build.gradle.kts
new file mode 100644
index 0000000..53db7a3
--- /dev/null
+++ b/core/designsystem/build.gradle.kts
@@ -0,0 +1,25 @@
+plugins {
+ alias(libs.plugins.songlib.android.library.compose)
+}
+
+android {
+ namespace = "com.songlib.core.designsystem"
+}
+
+dependencies {
+ api(project(":core:data"))
+
+
+ api(libs.material3)
+ api(libs.androidx.material3)
+ api(libs.androidx.ui)
+ api(libs.androidx.ui.graphics)
+ api(libs.androidx.foundation)
+ api(libs.androidx.activity.compose)
+ api(libs.androidx.compose.material)
+ api(libs.androidx.icons.extended)
+
+ debugImplementation(libs.androidx.ui.tooling)
+
+ implementation(libs.androidx.ui.tooling.preview)
+}
diff --git a/app/src/main/java/com/songlib/presentation/theme/Color.kt b/core/designsystem/src/main/java/com/songlib/core/designsystem/theme/Color.kt
similarity index 98%
rename from app/src/main/java/com/songlib/presentation/theme/Color.kt
rename to core/designsystem/src/main/java/com/songlib/core/designsystem/theme/Color.kt
index 43bc01e..dec461c 100644
--- a/app/src/main/java/com/songlib/presentation/theme/Color.kt
+++ b/core/designsystem/src/main/java/com/songlib/core/designsystem/theme/Color.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.theme
+package com.songlib.core.designsystem.theme
import androidx.compose.ui.graphics.Color
diff --git a/app/src/main/java/com/songlib/presentation/theme/Theme.kt b/core/designsystem/src/main/java/com/songlib/core/designsystem/theme/Theme.kt
similarity index 99%
rename from app/src/main/java/com/songlib/presentation/theme/Theme.kt
rename to core/designsystem/src/main/java/com/songlib/core/designsystem/theme/Theme.kt
index 609f876..53a3488 100644
--- a/app/src/main/java/com/songlib/presentation/theme/Theme.kt
+++ b/core/designsystem/src/main/java/com/songlib/core/designsystem/theme/Theme.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.theme
+package com.songlib.core.designsystem.theme
import android.app.Activity
import android.os.Build
diff --git a/app/src/main/java/com/songlib/presentation/theme/Typography.kt b/core/designsystem/src/main/java/com/songlib/core/designsystem/theme/Typography.kt
similarity index 95%
rename from app/src/main/java/com/songlib/presentation/theme/Typography.kt
rename to core/designsystem/src/main/java/com/songlib/core/designsystem/theme/Typography.kt
index 668cf01..6006949 100644
--- a/app/src/main/java/com/songlib/presentation/theme/Typography.kt
+++ b/core/designsystem/src/main/java/com/songlib/core/designsystem/theme/Typography.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.theme
+package com.songlib.core.designsystem.theme
import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle
diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts
new file mode 100644
index 0000000..582e334
--- /dev/null
+++ b/core/network/build.gradle.kts
@@ -0,0 +1,19 @@
+plugins {
+ alias(libs.plugins.songlib.android.library)
+ alias(libs.plugins.songlib.hilt)
+ kotlin("plugin.serialization") version "2.1.21"
+}
+
+android {
+ namespace = "com.songlib.core.network"
+ buildFeatures { buildConfig = true }
+}
+
+dependencies {
+ api(project(":core:database"))
+
+ implementation(platform(libs.jan.tennert.supabase.bom))
+ implementation(libs.jan.tennert.supabase.postgrest)
+ implementation(libs.ktor.client.android)
+ implementation(libs.kotlinx.serialization.json)
+}
diff --git a/app/src/main/java/com/songlib/data/sources/remote/ApiService.kt b/core/network/src/main/java/com/songlib/core/network/ApiService.kt
similarity index 70%
rename from app/src/main/java/com/songlib/data/sources/remote/ApiService.kt
rename to core/network/src/main/java/com/songlib/core/network/ApiService.kt
index 5cd9794..7a9a422 100644
--- a/app/src/main/java/com/songlib/data/sources/remote/ApiService.kt
+++ b/core/network/src/main/java/com/songlib/core/network/ApiService.kt
@@ -1,8 +1,8 @@
-package com.songlib.data.sources.remote
+package com.songlib.core.network
import androidx.annotation.Keep
-import com.songlib.core.utils.ApiConstants
-import com.songlib.data.models.*
+import com.songlib.core.common.utils.ApiConstants
+import com.songlib.core.database.model.*
import retrofit2.http.*
@Keep
diff --git a/app/src/main/java/com/songlib/core/di/NetworkModule.kt b/core/network/src/main/java/com/songlib/core/network/di/NetworkModule.kt
similarity index 91%
rename from app/src/main/java/com/songlib/core/di/NetworkModule.kt
rename to core/network/src/main/java/com/songlib/core/network/di/NetworkModule.kt
index 319eb60..ba78f7d 100644
--- a/app/src/main/java/com/songlib/core/di/NetworkModule.kt
+++ b/core/network/src/main/java/com/songlib/core/network/di/NetworkModule.kt
@@ -1,8 +1,8 @@
-package com.songlib.core.di
+package com.songlib.core.network.di
import com.songlib.BuildConfig
-import com.songlib.core.utils.ApiConstants
-import com.songlib.data.sources.remote.ApiService
+import com.songlib.core.common.utils.ApiConstants
+import com.songlib.core.network.ApiService
import dagger.*
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
diff --git a/core/network/src/main/java/com/songlib/core/network/dtos/IdiomDto.kt b/core/network/src/main/java/com/songlib/core/network/dtos/IdiomDto.kt
new file mode 100644
index 0000000..ca56e11
--- /dev/null
+++ b/core/network/src/main/java/com/songlib/core/network/dtos/IdiomDto.kt
@@ -0,0 +1,14 @@
+package com.songlib.core.network.dtos
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class IdiomDto(
+ val rid: Int = 0,
+ val title: String? = null,
+ val meaning: String? = null,
+ val views: Int = 0,
+ val likes: Int = 0,
+ val createdAt: String? = null,
+ val updatedAt: String? = null,
+)
diff --git a/core/network/src/main/java/com/songlib/core/network/dtos/ProverbDto.kt b/core/network/src/main/java/com/songlib/core/network/dtos/ProverbDto.kt
new file mode 100644
index 0000000..ea8e315
--- /dev/null
+++ b/core/network/src/main/java/com/songlib/core/network/dtos/ProverbDto.kt
@@ -0,0 +1,16 @@
+package com.songlib.core.network.dtos
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class ProverbDto(
+ val rid: Int = 0,
+ val title: String? = null,
+ val synonyms: String? = null,
+ val meaning: String? = null,
+ val conjugation: String? = null,
+ val views: Int = 0,
+ val likes: Int = 0,
+ val createdAt: String? = null,
+ val updatedAt: String? = null,
+)
diff --git a/core/network/src/main/java/com/songlib/core/network/dtos/SayingDto.kt b/core/network/src/main/java/com/songlib/core/network/dtos/SayingDto.kt
new file mode 100644
index 0000000..882d8c6
--- /dev/null
+++ b/core/network/src/main/java/com/songlib/core/network/dtos/SayingDto.kt
@@ -0,0 +1,14 @@
+package com.songlib.core.network.dtos
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class SayingDto(
+ val rid: Int = 0,
+ val title: String,
+ val meaning: String? = null,
+ val views: Int = 0,
+ val likes: Int = 0,
+ val createdAt: String? = null,
+ val updatedAt: String? = null,
+)
diff --git a/core/network/src/main/java/com/songlib/core/network/dtos/WordDto.kt b/core/network/src/main/java/com/songlib/core/network/dtos/WordDto.kt
new file mode 100644
index 0000000..66e31c5
--- /dev/null
+++ b/core/network/src/main/java/com/songlib/core/network/dtos/WordDto.kt
@@ -0,0 +1,16 @@
+package com.songlib.core.network.dtos
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class WordDto(
+ val rid: Int = 0,
+ val title: String? = null,
+ val synonyms: String? = null,
+ val meaning: String? = null,
+ val conjugation: String? = null,
+ val views: Int = 0,
+ val likes: Int = 0,
+ val createdAt: String? = null,
+ val updatedAt: String? = null,
+)
diff --git a/core/network/src/main/java/com/songlib/core/network/mapper/MapDtoToEntity.kt b/core/network/src/main/java/com/songlib/core/network/mapper/MapDtoToEntity.kt
new file mode 100644
index 0000000..e762dde
--- /dev/null
+++ b/core/network/src/main/java/com/songlib/core/network/mapper/MapDtoToEntity.kt
@@ -0,0 +1,64 @@
+package com.songlib.core.network.mapper
+
+import com.songlib.core.database.model.IdiomEntity
+import com.songlib.core.database.model.ProverbEntity
+import com.songlib.core.database.model.SayingEntity
+import com.songlib.core.database.model.WordEntity
+import com.songlib.core.network.dtos.IdiomDto
+import com.songlib.core.network.dtos.ProverbDto
+import com.songlib.core.network.dtos.SayingDto
+import com.songlib.core.network.dtos.WordDto
+
+object MapDtoToEntity {
+ fun mapToEntity(entity: IdiomDto): IdiomEntity {
+ return IdiomEntity(
+ rid = entity.rid,
+ title = entity.title,
+ meaning = entity.meaning,
+ views = entity.views,
+ likes = entity.likes,
+ createdAt = entity.createdAt,
+ updatedAt = entity.updatedAt,
+ )
+ }
+
+ fun mapToEntity(entity: ProverbDto): ProverbEntity {
+ return ProverbEntity(
+ rid = entity.rid,
+ title = entity.title,
+ synonyms = entity.synonyms,
+ meaning = entity.meaning,
+ conjugation = entity.conjugation,
+ views = entity.views,
+ likes = entity.likes,
+ createdAt = entity.createdAt,
+ updatedAt = entity.updatedAt,
+ )
+ }
+
+ fun mapToEntity(entity: SayingDto): SayingEntity {
+ return SayingEntity(
+ rid = entity.rid,
+ title = entity.title,
+ meaning = entity.meaning,
+ views = entity.views,
+ likes = entity.likes,
+ createdAt = entity.createdAt,
+ updatedAt = entity.updatedAt,
+ )
+ }
+
+ fun mapToEntity(entity: WordDto): WordEntity {
+ return WordEntity(
+ rid = entity.rid,
+ title = entity.title,
+ synonyms = entity.synonyms,
+ meaning = entity.meaning,
+ conjugation = entity.conjugation,
+ views = entity.views,
+ likes = entity.likes,
+ createdAt = entity.createdAt,
+ updatedAt = entity.updatedAt,
+ )
+ }
+}
\ No newline at end of file
diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts
new file mode 100644
index 0000000..7758aba
--- /dev/null
+++ b/core/ui/build.gradle.kts
@@ -0,0 +1,17 @@
+plugins {
+ alias(libs.plugins.songlib.android.library.compose)
+}
+
+android {
+ namespace = "com.songlib.core.ui"
+}
+
+dependencies {
+ api(project(":core:common"))
+ api(project(":core:database"))
+ api(project(":core:designsystem"))
+
+ implementation(libs.lottie.compose)
+ implementation(libs.androidx.compose.livedata)
+ implementation(libs.androidx.ui.tooling.preview)
+}
diff --git a/app/src/main/java/com/songlib/presentation/components/action/AppTopBar.kt b/core/ui/src/main/java/com/songlib/core/ui/components/action/AppTopBar.kt
similarity index 96%
rename from app/src/main/java/com/songlib/presentation/components/action/AppTopBar.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/action/AppTopBar.kt
index 8ab3ed1..ff33d83 100644
--- a/app/src/main/java/com/songlib/presentation/components/action/AppTopBar.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/action/AppTopBar.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.action
+package com.songlib.core.ui.components.action
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
diff --git a/app/src/main/java/com/songlib/presentation/components/action/Dialogs.kt b/core/ui/src/main/java/com/songlib/core/ui/components/action/Dialogs.kt
similarity index 94%
rename from app/src/main/java/com/songlib/presentation/components/action/Dialogs.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/action/Dialogs.kt
index ca79b53..2699d19 100644
--- a/app/src/main/java/com/songlib/presentation/components/action/Dialogs.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/action/Dialogs.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.action
+package com.songlib.core.ui.components.action
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Text
diff --git a/app/src/main/java/com/songlib/presentation/components/action/SearchTopBar.kt b/core/ui/src/main/java/com/songlib/core/ui/components/action/SearchTopBar.kt
similarity index 98%
rename from app/src/main/java/com/songlib/presentation/components/action/SearchTopBar.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/action/SearchTopBar.kt
index 34fcf7a..e1f3baa 100644
--- a/app/src/main/java/com/songlib/presentation/components/action/SearchTopBar.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/action/SearchTopBar.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.action
+package com.songlib.core.ui.components.action
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
diff --git a/app/src/main/java/com/songlib/presentation/components/action/UpgradeBanner.kt b/core/ui/src/main/java/com/songlib/core/ui/components/action/UpgradeBanner.kt
similarity index 97%
rename from app/src/main/java/com/songlib/presentation/components/action/UpgradeBanner.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/action/UpgradeBanner.kt
index 5b571ec..68ad9f9 100644
--- a/app/src/main/java/com/songlib/presentation/components/action/UpgradeBanner.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/action/UpgradeBanner.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.action
+package com.songlib.core.ui.components.action
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
diff --git a/app/src/main/java/com/songlib/presentation/components/autosize/AutoResizingText.kt b/core/ui/src/main/java/com/songlib/core/ui/components/autosize/AutoResizingText.kt
similarity index 96%
rename from app/src/main/java/com/songlib/presentation/components/autosize/AutoResizingText.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/autosize/AutoResizingText.kt
index b148a93..c8abc97 100644
--- a/app/src/main/java/com/songlib/presentation/components/autosize/AutoResizingText.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/autosize/AutoResizingText.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.autosize
+package com.songlib.core.ui.components.autosize
import android.annotation.SuppressLint
import androidx.compose.foundation.layout.BoxWithConstraints
diff --git a/app/src/main/java/com/songlib/presentation/components/autosize/AutoSizeText.kt b/core/ui/src/main/java/com/songlib/core/ui/components/autosize/AutoSizeText.kt
similarity index 98%
rename from app/src/main/java/com/songlib/presentation/components/autosize/AutoSizeText.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/autosize/AutoSizeText.kt
index dd5f01e..e1c3de8 100644
--- a/app/src/main/java/com/songlib/presentation/components/autosize/AutoSizeText.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/autosize/AutoSizeText.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.autosize
+package com.songlib.core.ui.components.autosize
import androidx.compose.material3.*
import androidx.compose.runtime.*
diff --git a/app/src/main/java/com/songlib/presentation/components/autosize/AutoSizeUtils.kt b/core/ui/src/main/java/com/songlib/core/ui/components/autosize/AutoSizeUtils.kt
similarity index 95%
rename from app/src/main/java/com/songlib/presentation/components/autosize/AutoSizeUtils.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/autosize/AutoSizeUtils.kt
index 162ee35..48b5139 100644
--- a/app/src/main/java/com/songlib/presentation/components/autosize/AutoSizeUtils.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/autosize/AutoSizeUtils.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.autosize
+package com.songlib.core.ui.components.autosize
import androidx.compose.ui.unit.TextUnit
diff --git a/app/src/main/java/com/songlib/presentation/components/general/AppDialogs.kt b/core/ui/src/main/java/com/songlib/core/ui/components/general/AppDialogs.kt
similarity index 97%
rename from app/src/main/java/com/songlib/presentation/components/general/AppDialogs.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/general/AppDialogs.kt
index 3032136..1a0064c 100644
--- a/app/src/main/java/com/songlib/presentation/components/general/AppDialogs.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/general/AppDialogs.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.general
+package com.songlib.core.ui.components.general
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
diff --git a/app/src/main/java/com/songlib/presentation/components/indicators/EmptyState.kt b/core/ui/src/main/java/com/songlib/core/ui/components/indicators/EmptyState.kt
similarity index 98%
rename from app/src/main/java/com/songlib/presentation/components/indicators/EmptyState.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/indicators/EmptyState.kt
index e612d21..d5a83d5 100644
--- a/app/src/main/java/com/songlib/presentation/components/indicators/EmptyState.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/indicators/EmptyState.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.indicators
+package com.songlib.core.ui.components.indicators
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
diff --git a/app/src/main/java/com/songlib/presentation/components/indicators/ErrorState.kt b/core/ui/src/main/java/com/songlib/core/ui/components/indicators/ErrorState.kt
similarity index 96%
rename from app/src/main/java/com/songlib/presentation/components/indicators/ErrorState.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/indicators/ErrorState.kt
index f36ffcd..53ff3d0 100644
--- a/app/src/main/java/com/songlib/presentation/components/indicators/ErrorState.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/indicators/ErrorState.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.indicators
+package com.songlib.core.ui.components.indicators
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
diff --git a/app/src/main/java/com/songlib/presentation/components/indicators/LoadingState.kt b/core/ui/src/main/java/com/songlib/core/ui/components/indicators/LoadingState.kt
similarity index 98%
rename from app/src/main/java/com/songlib/presentation/components/indicators/LoadingState.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/indicators/LoadingState.kt
index 84b2178..66ed3fd 100644
--- a/app/src/main/java/com/songlib/presentation/components/indicators/LoadingState.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/indicators/LoadingState.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.indicators
+package com.songlib.core.ui.components.indicators
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
diff --git a/app/src/main/java/com/songlib/presentation/components/listitems/BookItem.kt b/core/ui/src/main/java/com/songlib/core/ui/components/listitems/BookItem.kt
similarity index 96%
rename from app/src/main/java/com/songlib/presentation/components/listitems/BookItem.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/listitems/BookItem.kt
index b14005b..2afdd57 100644
--- a/app/src/main/java/com/songlib/presentation/components/listitems/BookItem.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/listitems/BookItem.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.listitems
+package com.songlib.core.ui.components.listitems
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.*
diff --git a/app/src/main/java/com/songlib/presentation/components/listitems/ListingItem.kt b/core/ui/src/main/java/com/songlib/core/ui/components/listitems/ListingItem.kt
similarity index 95%
rename from app/src/main/java/com/songlib/presentation/components/listitems/ListingItem.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/listitems/ListingItem.kt
index 20185d0..3b55982 100644
--- a/app/src/main/java/com/songlib/presentation/components/listitems/ListingItem.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/listitems/ListingItem.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.listitems
+package com.songlib.core.ui.components.listitems
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
@@ -8,7 +8,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.*
-import com.songlib.data.models.ListingUi
+import com.songlib.core.database.model.ListingUi
@Composable
fun ListingItem(listing: ListingUi) {
diff --git a/app/src/main/java/com/songlib/presentation/components/listitems/SongBook.kt b/core/ui/src/main/java/com/songlib/core/ui/components/listitems/SongBook.kt
similarity index 90%
rename from app/src/main/java/com/songlib/presentation/components/listitems/SongBook.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/listitems/SongBook.kt
index f40e84c..44e36f0 100644
--- a/app/src/main/java/com/songlib/presentation/components/listitems/SongBook.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/listitems/SongBook.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.listitems
+package com.songlib.core.ui.components.listitems
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
@@ -13,10 +13,10 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.*
-import com.songlib.core.utils.refineTitle
-import com.songlib.data.models.Book
-import com.songlib.data.sample.SampleBooks
-import com.songlib.domain.entity.Selectable
+import com.songlib.core.common.utils.refineTitle
+import com.songlib.core.database.model.Book
+import com.songlib.core.ui.sample.SampleBooks
+import com.songlib.core.common.entity.Selectable
@Composable
fun SongBook(
item: Selectable,
diff --git a/app/src/main/java/com/songlib/presentation/components/listitems/SongItem.kt b/core/ui/src/main/java/com/songlib/core/ui/components/listitems/SongItem.kt
similarity index 93%
rename from app/src/main/java/com/songlib/presentation/components/listitems/SongItem.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/listitems/SongItem.kt
index 7f61ecc..5a1f870 100644
--- a/app/src/main/java/com/songlib/presentation/components/listitems/SongItem.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/listitems/SongItem.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.listitems
+package com.songlib.core.ui.components.listitems
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
@@ -11,9 +11,9 @@ import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.*
-import com.songlib.core.utils.*
-import com.songlib.data.models.Song
-import com.songlib.data.sample.SampleSongs
+import com.songlib.core.common.utils.*
+import com.songlib.core.database.model.Song
+import com.songlib.core.ui.sample.SampleSongs
@Composable
fun SongItem(song: Song) {
diff --git a/app/src/main/java/com/songlib/presentation/components/listitems/TagItem.kt b/core/ui/src/main/java/com/songlib/core/ui/components/listitems/TagItem.kt
similarity index 95%
rename from app/src/main/java/com/songlib/presentation/components/listitems/TagItem.kt
rename to core/ui/src/main/java/com/songlib/core/ui/components/listitems/TagItem.kt
index 55dde0c..8a605d6 100644
--- a/app/src/main/java/com/songlib/presentation/components/listitems/TagItem.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/components/listitems/TagItem.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.components.listitems
+package com.songlib.core.ui.components.listitems
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
diff --git a/app/src/main/java/com/songlib/data/sample/SampleBooks.kt b/core/ui/src/main/java/com/songlib/core/ui/sample/SampleBooks.kt
similarity index 94%
rename from app/src/main/java/com/songlib/data/sample/SampleBooks.kt
rename to core/ui/src/main/java/com/songlib/core/ui/sample/SampleBooks.kt
index 8cdc6c8..44b6640 100644
--- a/app/src/main/java/com/songlib/data/sample/SampleBooks.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/sample/SampleBooks.kt
@@ -1,7 +1,7 @@
-package com.songlib.data.sample
+package com.songlib.core.ui.sample
-import com.songlib.data.models.Book
-import com.songlib.domain.entity.Selectable
+import com.songlib.core.database.model.Book
+import com.songlib.core.common.entity.Selectable
val SampleBooks = listOf(
Book(
diff --git a/app/src/main/java/com/songlib/data/sample/SampleSongs.kt b/core/ui/src/main/java/com/songlib/core/ui/sample/SampleSongs.kt
similarity index 98%
rename from app/src/main/java/com/songlib/data/sample/SampleSongs.kt
rename to core/ui/src/main/java/com/songlib/core/ui/sample/SampleSongs.kt
index cda27e4..bcc95fd 100644
--- a/app/src/main/java/com/songlib/data/sample/SampleSongs.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/sample/SampleSongs.kt
@@ -1,6 +1,6 @@
-package com.songlib.data.sample
+package com.songlib.core.ui.sample
-import com.songlib.data.models.Song
+import com.songlib.core.database.model.Song
val SampleSongs = listOf(
Song(
diff --git a/app/src/main/java/com/songlib/data/sample/SampleVerses.kt b/core/ui/src/main/java/com/songlib/core/ui/sample/SampleVerses.kt
similarity index 94%
rename from app/src/main/java/com/songlib/data/sample/SampleVerses.kt
rename to core/ui/src/main/java/com/songlib/core/ui/sample/SampleVerses.kt
index 4167f25..19c74b9 100644
--- a/app/src/main/java/com/songlib/data/sample/SampleVerses.kt
+++ b/core/ui/src/main/java/com/songlib/core/ui/sample/SampleVerses.kt
@@ -1,6 +1,6 @@
-package com.songlib.data.sample
+package com.songlib.core.ui.sample
-import com.songlib.data.models.Song
+import com.songlib.core.database.model.Song
val SampleVerses = listOf(
"They come from the East and West,\nThey come from the lands afar,\nTo feast with the King, to dine as\nHis guest\nHow Blessed these pilgrims are!\nBeholding His hallowed face\nAglow with light divine;\nBlest partakers of His grace,\nAs gems in His crown to shine.',",
diff --git a/core/ui/src/main/res/drawable/app_icon.png b/core/ui/src/main/res/drawable/app_icon.png
new file mode 100644
index 0000000..837d16a
Binary files /dev/null and b/core/ui/src/main/res/drawable/app_icon.png differ
diff --git a/core/ui/src/main/res/drawable/empty.png b/core/ui/src/main/res/drawable/empty.png
new file mode 100644
index 0000000..66ae11f
Binary files /dev/null and b/core/ui/src/main/res/drawable/empty.png differ
diff --git a/feature/home/build.gradle.kts b/feature/home/build.gradle.kts
new file mode 100644
index 0000000..5dc1486
--- /dev/null
+++ b/feature/home/build.gradle.kts
@@ -0,0 +1,15 @@
+plugins {
+ alias(libs.plugins.songlib.android.feature)
+ alias(libs.plugins.songlib.android.library.compose)
+}
+
+android {
+ namespace = "com.songlib.feature.home"
+}
+
+dependencies {
+ implementation(project(":core:common"))
+ implementation(project(":core:data"))
+ implementation(libs.revenuecat)
+ implementation(libs.revenuecat.ui)
+}
diff --git a/app/src/main/java/com/songlib/presentation/home/HomeViewModel.kt b/feature/home/src/main/java/com/songlib/feature/home/HomeViewModel.kt
similarity index 93%
rename from app/src/main/java/com/songlib/presentation/home/HomeViewModel.kt
rename to feature/home/src/main/java/com/songlib/feature/home/HomeViewModel.kt
index 46151eb..247ef5d 100644
--- a/app/src/main/java/com/songlib/presentation/home/HomeViewModel.kt
+++ b/feature/home/src/main/java/com/songlib/feature/home/HomeViewModel.kt
@@ -1,17 +1,17 @@
-package com.songlib.presentation.home
+package com.songlib.feature.home
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.songlib.core.utils.SongUtils
-import com.songlib.data.models.Book
-import com.songlib.data.models.ListingUi
-import com.songlib.data.models.Song
-import com.songlib.domain.entity.UiState
-import com.songlib.domain.repos.ListingRepo
-import com.songlib.domain.repos.PrefsRepo
-import com.songlib.domain.repos.SongBookRepo
-import com.songlib.presentation.home.components.HomeNavItem
+import com.songlib.core.common.utils.SongUtils
+import com.songlib.core.database.model.Book
+import com.songlib.core.database.model.ListingUi
+import com.songlib.core.database.model.Song
+import com.songlib.core.common.entity.UiState
+import com.songlib.core.data.repos.ListingRepo
+import com.songlib.core.data.repos.PrefsRepo
+import com.songlib.core.data.repos.SongBookRepo
+import com.songlib.feature.home.components.HomeNavItem
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
diff --git a/app/src/main/java/com/songlib/presentation/home/components/BottomNavBar.kt b/feature/home/src/main/java/com/songlib/feature/home/components/BottomNavBar.kt
similarity index 97%
rename from app/src/main/java/com/songlib/presentation/home/components/BottomNavBar.kt
rename to feature/home/src/main/java/com/songlib/feature/home/components/BottomNavBar.kt
index 8ef0226..36e21dc 100644
--- a/app/src/main/java/com/songlib/presentation/home/components/BottomNavBar.kt
+++ b/feature/home/src/main/java/com/songlib/feature/home/components/BottomNavBar.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.home.components
+package com.songlib.feature.home.components
//noinspection UsingMaterialAndMaterial3Libraries
import androidx.compose.material.*
diff --git a/app/src/main/java/com/songlib/presentation/home/components/ChooseListingSheet.kt b/feature/home/src/main/java/com/songlib/feature/home/components/ChooseListingSheet.kt
similarity index 98%
rename from app/src/main/java/com/songlib/presentation/home/components/ChooseListingSheet.kt
rename to feature/home/src/main/java/com/songlib/feature/home/components/ChooseListingSheet.kt
index 317a532..1b6de51 100644
--- a/app/src/main/java/com/songlib/presentation/home/components/ChooseListingSheet.kt
+++ b/feature/home/src/main/java/com/songlib/feature/home/components/ChooseListingSheet.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.home.components
+package com.songlib.feature.home.components
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
@@ -11,7 +11,7 @@ import androidx.compose.runtime.*
import androidx.compose.ui.*
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
-import com.songlib.data.models.ListingUi
+import com.songlib.core.database.model.ListingUi
@OptIn(ExperimentalMaterial3Api::class)
@Composable
diff --git a/app/src/main/java/com/songlib/presentation/home/components/DialPad.kt b/feature/home/src/main/java/com/songlib/feature/home/components/DialPad.kt
similarity index 98%
rename from app/src/main/java/com/songlib/presentation/home/components/DialPad.kt
rename to feature/home/src/main/java/com/songlib/feature/home/components/DialPad.kt
index 5801e54..2a97b17 100644
--- a/app/src/main/java/com/songlib/presentation/home/components/DialPad.kt
+++ b/feature/home/src/main/java/com/songlib/feature/home/components/DialPad.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.home.components
+package com.songlib.feature.home.components
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
diff --git a/app/src/main/java/com/songlib/presentation/home/components/HomeAppBar.kt b/feature/home/src/main/java/com/songlib/feature/home/components/HomeAppBar.kt
similarity index 92%
rename from app/src/main/java/com/songlib/presentation/home/components/HomeAppBar.kt
rename to feature/home/src/main/java/com/songlib/feature/home/components/HomeAppBar.kt
index 30ca83c..4404fd9 100644
--- a/app/src/main/java/com/songlib/presentation/home/components/HomeAppBar.kt
+++ b/feature/home/src/main/java/com/songlib/feature/home/components/HomeAppBar.kt
@@ -1,13 +1,13 @@
-package com.songlib.presentation.home.components
+package com.songlib.feature.home.components
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
-import com.songlib.data.models.Song
-import com.songlib.presentation.components.action.AppTopBar
-import com.songlib.presentation.components.general.QuickFormDialog
-import com.songlib.presentation.home.HomeViewModel
+import com.songlib.core.database.model.Song
+import com.songlib.core.ui.components.action.AppTopBar
+import com.songlib.core.ui.components.general.QuickFormDialog
+import com.songlib.feature.home.HomeViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable
diff --git a/app/src/main/java/com/songlib/presentation/home/components/ListingsList.kt b/feature/home/src/main/java/com/songlib/feature/home/components/ListingsList.kt
similarity index 90%
rename from app/src/main/java/com/songlib/presentation/home/components/ListingsList.kt
rename to feature/home/src/main/java/com/songlib/feature/home/components/ListingsList.kt
index 97b936e..c7d801f 100644
--- a/app/src/main/java/com/songlib/presentation/home/components/ListingsList.kt
+++ b/feature/home/src/main/java/com/songlib/feature/home/components/ListingsList.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.home.components
+package com.songlib.feature.home.components
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
@@ -10,9 +10,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
-import com.songlib.presentation.navigation.Routes
-import com.songlib.data.models.ListingUi
-import com.songlib.presentation.components.listitems.ListingItem
+import com.songlib.core.common.utils.Routes
+import com.songlib.core.database.model.ListingUi
+import com.songlib.core.ui.components.listitems.ListingItem
@Composable
fun ListingsList(
diff --git a/app/src/main/java/com/songlib/presentation/home/components/SongsList.kt b/feature/home/src/main/java/com/songlib/feature/home/components/SongsList.kt
similarity index 91%
rename from app/src/main/java/com/songlib/presentation/home/components/SongsList.kt
rename to feature/home/src/main/java/com/songlib/feature/home/components/SongsList.kt
index 3d2c54f..ea81c7a 100644
--- a/app/src/main/java/com/songlib/presentation/home/components/SongsList.kt
+++ b/feature/home/src/main/java/com/songlib/feature/home/components/SongsList.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.home.components
+package com.songlib.feature.home.components
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
@@ -12,10 +12,10 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import androidx.navigation.NavHostController
-import com.songlib.data.models.Song
-import com.songlib.presentation.components.listitems.*
-import com.songlib.presentation.navigation.Routes
-import com.songlib.presentation.home.HomeViewModel
+import com.songlib.core.database.model.Song
+import com.songlib.core.ui.components.listitems.*
+import com.songlib.core.common.utils.Routes
+import com.songlib.feature.home.HomeViewModel
@Composable
fun SongsList(
diff --git a/app/src/main/java/com/songlib/presentation/home/view/HomeScreen.kt b/feature/home/src/main/java/com/songlib/feature/home/view/HomeScreen.kt
similarity index 88%
rename from app/src/main/java/com/songlib/presentation/home/view/HomeScreen.kt
rename to feature/home/src/main/java/com/songlib/feature/home/view/HomeScreen.kt
index 7343dbd..b5458ad 100644
--- a/app/src/main/java/com/songlib/presentation/home/view/HomeScreen.kt
+++ b/feature/home/src/main/java/com/songlib/feature/home/view/HomeScreen.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.home.view
+package com.songlib.feature.home.view
import androidx.compose.foundation.layout.*
//noinspection UsingMaterialAndMaterial3Libraries
@@ -10,13 +10,13 @@ import androidx.compose.runtime.*
import androidx.compose.ui.*
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
-import com.songlib.domain.entity.UiState
-import com.songlib.presentation.components.indicators.*
-import com.songlib.presentation.home.HomeViewModel
-import com.songlib.presentation.components.indicators.ErrorState
-import com.songlib.presentation.home.components.*
-import com.songlib.presentation.home.view.tabs.*
-import com.songlib.presentation.navigation.Routes
+import com.songlib.core.common.entity.UiState
+import com.songlib.core.ui.components.indicators.*
+import com.songlib.feature.home.HomeViewModel
+import com.songlib.core.ui.components.indicators.ErrorState
+import com.songlib.feature.home.components.*
+import com.songlib.feature.home.view.tabs.*
+import com.songlib.core.common.utils.Routes
@OptIn(ExperimentalMaterialApi::class)
@Composable
diff --git a/app/src/main/java/com/songlib/presentation/home/view/tabs/HomeLikes.kt b/feature/home/src/main/java/com/songlib/feature/home/view/tabs/HomeLikes.kt
similarity index 88%
rename from app/src/main/java/com/songlib/presentation/home/view/tabs/HomeLikes.kt
rename to feature/home/src/main/java/com/songlib/feature/home/view/tabs/HomeLikes.kt
index 950bd5a..f722153 100644
--- a/app/src/main/java/com/songlib/presentation/home/view/tabs/HomeLikes.kt
+++ b/feature/home/src/main/java/com/songlib/feature/home/view/tabs/HomeLikes.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.home.view.tabs
+package com.songlib.feature.home.view.tabs
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
@@ -7,13 +7,13 @@ import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.*
import androidx.navigation.NavHostController
-import com.songlib.data.models.Song
-import com.songlib.domain.entity.UiState
-import com.songlib.presentation.components.action.AppTopBar
-import com.songlib.presentation.components.indicators.*
-import com.songlib.presentation.home.components.SongsList
-import com.songlib.presentation.navigation.Routes
-import com.songlib.presentation.home.HomeViewModel
+import com.songlib.core.database.model.Song
+import com.songlib.core.common.entity.UiState
+import com.songlib.core.ui.components.action.AppTopBar
+import com.songlib.core.ui.components.indicators.*
+import com.songlib.feature.home.components.SongsList
+import com.songlib.core.common.utils.Routes
+import com.songlib.feature.home.HomeViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable
diff --git a/app/src/main/java/com/songlib/presentation/home/view/tabs/HomeListings.kt b/feature/home/src/main/java/com/songlib/feature/home/view/tabs/HomeListings.kt
similarity index 92%
rename from app/src/main/java/com/songlib/presentation/home/view/tabs/HomeListings.kt
rename to feature/home/src/main/java/com/songlib/feature/home/view/tabs/HomeListings.kt
index c74c53c..aa47fe0 100644
--- a/app/src/main/java/com/songlib/presentation/home/view/tabs/HomeListings.kt
+++ b/feature/home/src/main/java/com/songlib/feature/home/view/tabs/HomeListings.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.home.view.tabs
+package com.songlib.feature.home.view.tabs
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
@@ -11,14 +11,14 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.*
import androidx.navigation.NavHostController
import com.revenuecat.purchases.ui.revenuecatui.*
-import com.songlib.presentation.home.components.ListingsList
-import com.songlib.data.models.ListingUi
-import com.songlib.domain.entity.UiState
-import com.songlib.presentation.components.action.*
-import com.songlib.presentation.components.general.*
-import com.songlib.presentation.components.indicators.*
-import com.songlib.presentation.navigation.Routes
-import com.songlib.presentation.home.HomeViewModel
+import com.songlib.feature.home.components.ListingsList
+import com.songlib.core.database.model.ListingUi
+import com.songlib.core.common.entity.UiState
+import com.songlib.core.ui.components.action.*
+import com.songlib.core.ui.components.general.*
+import com.songlib.core.ui.components.indicators.*
+import com.songlib.core.common.utils.Routes
+import com.songlib.feature.home.HomeViewModel
import kotlin.collections.plus
@OptIn(ExperimentalMaterial3Api::class)
diff --git a/app/src/main/java/com/songlib/presentation/home/view/tabs/HomeSearch.kt b/feature/home/src/main/java/com/songlib/feature/home/view/tabs/HomeSearch.kt
similarity index 90%
rename from app/src/main/java/com/songlib/presentation/home/view/tabs/HomeSearch.kt
rename to feature/home/src/main/java/com/songlib/feature/home/view/tabs/HomeSearch.kt
index 0e82061..f7a8c9b 100644
--- a/app/src/main/java/com/songlib/presentation/home/view/tabs/HomeSearch.kt
+++ b/feature/home/src/main/java/com/songlib/feature/home/view/tabs/HomeSearch.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.home.view.tabs
+package com.songlib.feature.home.view.tabs
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
@@ -8,21 +8,21 @@ import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.*
import androidx.navigation.NavHostController
-import com.songlib.domain.entity.UiState
-import com.songlib.presentation.components.action.*
-import com.songlib.presentation.navigation.Routes
-import com.songlib.presentation.home.HomeViewModel
+import com.songlib.core.common.entity.UiState
+import com.songlib.core.ui.components.action.*
+import com.songlib.core.common.utils.Routes
+import com.songlib.feature.home.HomeViewModel
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import com.revenuecat.purchases.ui.revenuecatui.Paywall
import com.revenuecat.purchases.ui.revenuecatui.PaywallOptions
-import com.songlib.data.models.Song
-import com.songlib.presentation.components.indicators.EmptyState
-import com.songlib.presentation.home.components.DialPad
-import com.songlib.presentation.home.components.HomeSearchAppBar
-import com.songlib.presentation.home.components.SongsList
+import com.songlib.core.database.model.Song
+import com.songlib.core.ui.components.indicators.EmptyState
+import com.songlib.feature.home.components.DialPad
+import com.songlib.feature.home.components.HomeSearchAppBar
+import com.songlib.feature.home.components.SongsList
@OptIn(ExperimentalMaterial3Api::class)
@Composable
diff --git a/feature/listing/build.gradle.kts b/feature/listing/build.gradle.kts
new file mode 100644
index 0000000..5dc1486
--- /dev/null
+++ b/feature/listing/build.gradle.kts
@@ -0,0 +1,15 @@
+plugins {
+ alias(libs.plugins.songlib.android.feature)
+ alias(libs.plugins.songlib.android.library.compose)
+}
+
+android {
+ namespace = "com.songlib.feature.home"
+}
+
+dependencies {
+ implementation(project(":core:common"))
+ implementation(project(":core:data"))
+ implementation(libs.revenuecat)
+ implementation(libs.revenuecat.ui)
+}
diff --git a/app/src/main/java/com/songlib/presentation/listing/ListingViewModel.kt b/feature/listing/src/main/java/com/songlib/feature/listing/ListingViewModel.kt
similarity index 91%
rename from app/src/main/java/com/songlib/presentation/listing/ListingViewModel.kt
rename to feature/listing/src/main/java/com/songlib/feature/listing/ListingViewModel.kt
index 86d631a..e30db10 100644
--- a/app/src/main/java/com/songlib/presentation/listing/ListingViewModel.kt
+++ b/feature/listing/src/main/java/com/songlib/feature/listing/ListingViewModel.kt
@@ -1,13 +1,13 @@
-package com.songlib.presentation.listing
+package com.songlib.feature.listing
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.songlib.data.models.ListingUi
-import com.songlib.data.models.Song
-import com.songlib.domain.entity.UiState
-import com.songlib.domain.repos.ListingRepo
-import com.songlib.domain.repos.SongBookRepo
+import com.songlib.core.database.model.ListingUi
+import com.songlib.core.database.model.Song
+import com.songlib.core.common.entity.UiState
+import com.songlib.core.data.repos.ListingRepo
+import com.songlib.core.data.repos.SongBookRepo
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
diff --git a/app/src/main/java/com/songlib/presentation/listing/view/ListedSongs.kt b/feature/listing/src/main/java/com/songlib/feature/listing/view/ListedSongs.kt
similarity index 90%
rename from app/src/main/java/com/songlib/presentation/listing/view/ListedSongs.kt
rename to feature/listing/src/main/java/com/songlib/feature/listing/view/ListedSongs.kt
index 99c1576..930f383 100644
--- a/app/src/main/java/com/songlib/presentation/listing/view/ListedSongs.kt
+++ b/feature/listing/src/main/java/com/songlib/feature/listing/view/ListedSongs.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.listing.view
+package com.songlib.feature.listing.view
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
@@ -10,9 +10,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
-import com.songlib.data.models.Song
-import com.songlib.presentation.components.listitems.*
-import com.songlib.presentation.navigation.Routes
+import com.songlib.core.database.model.Song
+import com.songlib.core.ui.components.listitems.*
+import com.songlib.core.common.utils.Routes
@Composable
fun ListedSongs(
diff --git a/app/src/main/java/com/songlib/presentation/listing/view/ListingScreen.kt b/feature/listing/src/main/java/com/songlib/feature/listing/view/ListingScreen.kt
similarity index 91%
rename from app/src/main/java/com/songlib/presentation/listing/view/ListingScreen.kt
rename to feature/listing/src/main/java/com/songlib/feature/listing/view/ListingScreen.kt
index a4756d2..b91080b 100644
--- a/app/src/main/java/com/songlib/presentation/listing/view/ListingScreen.kt
+++ b/feature/listing/src/main/java/com/songlib/feature/listing/view/ListingScreen.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.listing.view
+package com.songlib.feature.listing.view
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
@@ -8,12 +8,12 @@ import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.navigation.NavHostController
-import com.songlib.data.models.*
-import com.songlib.domain.entity.UiState
-import com.songlib.presentation.components.action.AppTopBar
-import com.songlib.presentation.components.general.*
-import com.songlib.presentation.components.indicators.*
-import com.songlib.presentation.listing.ListingViewModel
+import com.songlib.core.database.model.*
+import com.songlib.core.common.entity.UiState
+import com.songlib.core.ui.components.action.AppTopBar
+import com.songlib.core.ui.components.general.*
+import com.songlib.core.ui.components.indicators.*
+import com.songlib.feature.listing.ListingViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable
diff --git a/feature/presenter/build.gradle.kts b/feature/presenter/build.gradle.kts
new file mode 100644
index 0000000..5dc1486
--- /dev/null
+++ b/feature/presenter/build.gradle.kts
@@ -0,0 +1,15 @@
+plugins {
+ alias(libs.plugins.songlib.android.feature)
+ alias(libs.plugins.songlib.android.library.compose)
+}
+
+android {
+ namespace = "com.songlib.feature.home"
+}
+
+dependencies {
+ implementation(project(":core:common"))
+ implementation(project(":core:data"))
+ implementation(libs.revenuecat)
+ implementation(libs.revenuecat.ui)
+}
diff --git a/app/src/main/java/com/songlib/presentation/presenter/PresenterViewModel.kt b/feature/presenter/src/main/java/com/songlib/feature/presenter/PresenterViewModel.kt
similarity index 89%
rename from app/src/main/java/com/songlib/presentation/presenter/PresenterViewModel.kt
rename to feature/presenter/src/main/java/com/songlib/feature/presenter/PresenterViewModel.kt
index 01d22e3..7ca36c8 100644
--- a/app/src/main/java/com/songlib/presentation/presenter/PresenterViewModel.kt
+++ b/feature/presenter/src/main/java/com/songlib/feature/presenter/PresenterViewModel.kt
@@ -1,13 +1,13 @@
-package com.songlib.presentation.presenter
+package com.songlib.feature.presenter
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.songlib.core.utils.getSongVerses
-import com.songlib.core.utils.songItemTitle
-import com.songlib.data.models.Song
-import com.songlib.domain.entity.UiState
-import com.songlib.domain.repos.PrefsRepo
-import com.songlib.domain.repos.SongBookRepo
+import com.songlib.core.common.utils.getSongVerses
+import com.songlib.core.common.utils.songItemTitle
+import com.songlib.core.database.model.Song
+import com.songlib.core.common.entity.UiState
+import com.songlib.core.data.repos.PrefsRepo
+import com.songlib.core.data.repos.SongBookRepo
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
diff --git a/app/src/main/java/com/songlib/presentation/presenter/components/PresenterIndicators.kt b/feature/presenter/src/main/java/com/songlib/feature/presenter/components/PresenterIndicators.kt
similarity index 96%
rename from app/src/main/java/com/songlib/presentation/presenter/components/PresenterIndicators.kt
rename to feature/presenter/src/main/java/com/songlib/feature/presenter/components/PresenterIndicators.kt
index 459c7cd..4c5bdbe 100644
--- a/app/src/main/java/com/songlib/presentation/presenter/components/PresenterIndicators.kt
+++ b/feature/presenter/src/main/java/com/songlib/feature/presenter/components/PresenterIndicators.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.presenter.components
+package com.songlib.feature.presenter.components
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
@@ -8,7 +8,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.foundation.pager.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.ui.tooling.preview.Preview
-import com.songlib.data.sample.*
+import com.songlib.core.ui.sample.*
import kotlinx.coroutines.launch
import androidx.compose.foundation.lazy.grid.*
import androidx.compose.ui.text.TextStyle
diff --git a/app/src/main/java/com/songlib/presentation/presenter/components/PresenterTabs.kt b/feature/presenter/src/main/java/com/songlib/feature/presenter/components/PresenterTabs.kt
similarity index 91%
rename from app/src/main/java/com/songlib/presentation/presenter/components/PresenterTabs.kt
rename to feature/presenter/src/main/java/com/songlib/feature/presenter/components/PresenterTabs.kt
index c1df837..f040054 100644
--- a/app/src/main/java/com/songlib/presentation/presenter/components/PresenterTabs.kt
+++ b/feature/presenter/src/main/java/com/songlib/feature/presenter/components/PresenterTabs.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.presenter.components
+package com.songlib.feature.presenter.components
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
@@ -10,9 +10,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.sp
-import com.songlib.data.sample.*
-import com.songlib.presentation.components.autosize.AutoResizingText
-import com.songlib.presentation.components.autosize.AutoSizeText
+import com.songlib.core.ui.sample.*
+import com.songlib.core.ui.components.autosize.AutoResizingText
+import com.songlib.core.ui.components.autosize.AutoSizeText
@Composable
fun PresenterTabs(
diff --git a/app/src/main/java/com/songlib/presentation/presenter/view/PresenterScreen.kt b/feature/presenter/src/main/java/com/songlib/feature/presenter/view/PresenterScreen.kt
similarity index 90%
rename from app/src/main/java/com/songlib/presentation/presenter/view/PresenterScreen.kt
rename to feature/presenter/src/main/java/com/songlib/feature/presenter/view/PresenterScreen.kt
index b60056e..156929c 100644
--- a/app/src/main/java/com/songlib/presentation/presenter/view/PresenterScreen.kt
+++ b/feature/presenter/src/main/java/com/songlib/feature/presenter/view/PresenterScreen.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.presenter.view
+package com.songlib.feature.presenter.view
import android.widget.Toast
import androidx.compose.foundation.layout.*
@@ -12,13 +12,13 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
-import com.songlib.data.models.Song
-import com.songlib.data.sample.*
-import com.songlib.domain.entity.UiState
-import com.songlib.presentation.components.action.AppTopBar
-import com.songlib.presentation.components.indicators.*
-import com.songlib.presentation.presenter.PresenterViewModel
-import com.songlib.presentation.presenter.components.*
+import com.songlib.core.database.model.Song
+import com.songlib.core.ui.sample.*
+import com.songlib.core.common.entity.UiState
+import com.songlib.core.ui.components.action.AppTopBar
+import com.songlib.core.ui.components.indicators.*
+import com.songlib.feature.presenter.PresenterViewModel
+import com.songlib.feature.presenter.components.*
@OptIn(ExperimentalMaterial3Api::class)
@Composable
diff --git a/feature/selection/build.gradle.kts b/feature/selection/build.gradle.kts
new file mode 100644
index 0000000..5dc1486
--- /dev/null
+++ b/feature/selection/build.gradle.kts
@@ -0,0 +1,15 @@
+plugins {
+ alias(libs.plugins.songlib.android.feature)
+ alias(libs.plugins.songlib.android.library.compose)
+}
+
+android {
+ namespace = "com.songlib.feature.home"
+}
+
+dependencies {
+ implementation(project(":core:common"))
+ implementation(project(":core:data"))
+ implementation(libs.revenuecat)
+ implementation(libs.revenuecat.ui)
+}
diff --git a/app/src/main/java/com/songlib/presentation/selection/SelectionViewModel.kt b/feature/selection/src/main/java/com/songlib/feature/selection/SelectionViewModel.kt
similarity index 97%
rename from app/src/main/java/com/songlib/presentation/selection/SelectionViewModel.kt
rename to feature/selection/src/main/java/com/songlib/feature/selection/SelectionViewModel.kt
index 0b6018b..63d8b9a 100644
--- a/app/src/main/java/com/songlib/presentation/selection/SelectionViewModel.kt
+++ b/feature/selection/src/main/java/com/songlib/feature/selection/SelectionViewModel.kt
@@ -1,10 +1,10 @@
-package com.songlib.presentation.selection
+package com.songlib.feature.selection
import android.util.Log
import androidx.lifecycle.*
-import com.songlib.data.models.Book
-import com.songlib.domain.entity.*
-import com.songlib.domain.repos.*
+import com.songlib.core.database.model.Book
+import com.songlib.core.common.entity.*
+import com.songlib.core.data.repos.*
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.*
diff --git a/app/src/main/java/com/songlib/presentation/selection/components/SelectionFab.kt b/feature/selection/src/main/java/com/songlib/feature/selection/components/SelectionFab.kt
similarity index 87%
rename from app/src/main/java/com/songlib/presentation/selection/components/SelectionFab.kt
rename to feature/selection/src/main/java/com/songlib/feature/selection/components/SelectionFab.kt
index 95970bd..119b13d 100644
--- a/app/src/main/java/com/songlib/presentation/selection/components/SelectionFab.kt
+++ b/feature/selection/src/main/java/com/songlib/feature/selection/components/SelectionFab.kt
@@ -1,12 +1,12 @@
-package com.songlib.presentation.selection.components
+package com.songlib.feature.selection.components
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
-import com.songlib.data.models.Book
-import com.songlib.presentation.components.general.*
-import com.songlib.presentation.selection.SelectionViewModel
+import com.songlib.core.database.model.Book
+import com.songlib.core.ui.components.general.*
+import com.songlib.feature.selection.SelectionViewModel
@Composable
fun Step1Fab(
diff --git a/app/src/main/java/com/songlib/presentation/selection/view/SelectionContent.kt b/feature/selection/src/main/java/com/songlib/feature/selection/view/SelectionContent.kt
similarity index 85%
rename from app/src/main/java/com/songlib/presentation/selection/view/SelectionContent.kt
rename to feature/selection/src/main/java/com/songlib/feature/selection/view/SelectionContent.kt
index ac70f53..539edfc 100644
--- a/app/src/main/java/com/songlib/presentation/selection/view/SelectionContent.kt
+++ b/feature/selection/src/main/java/com/songlib/feature/selection/view/SelectionContent.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.selection.view
+package com.songlib.feature.selection.view
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
@@ -8,10 +8,10 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import com.songlib.data.models.Book
-import com.songlib.data.sample.SampleSelectableBooks
-import com.songlib.domain.entity.*
-import com.songlib.presentation.components.listitems.SongBook
+import com.songlib.core.database.model.Book
+import com.songlib.core.ui.sample.SampleSelectableBooks
+import com.songlib.core.common.entity.*
+import com.songlib.core.ui.components.listitems.SongBook
@Composable
fun SelectionContent(
diff --git a/app/src/main/java/com/songlib/presentation/selection/view/SelectionScreen.kt b/feature/selection/src/main/java/com/songlib/feature/selection/view/SelectionScreen.kt
similarity index 92%
rename from app/src/main/java/com/songlib/presentation/selection/view/SelectionScreen.kt
rename to feature/selection/src/main/java/com/songlib/feature/selection/view/SelectionScreen.kt
index d612dbe..766a7af 100644
--- a/app/src/main/java/com/songlib/presentation/selection/view/SelectionScreen.kt
+++ b/feature/selection/src/main/java/com/songlib/feature/selection/view/SelectionScreen.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.selection.view
+package com.songlib.feature.selection.view
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
@@ -10,13 +10,13 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.window.*
import androidx.navigation.NavHostController
import com.revenuecat.purchases.ui.revenuecatui.*
-import com.songlib.domain.entity.UiState
-import com.songlib.domain.repos.*
-import com.songlib.presentation.components.action.AppTopBar
-import com.songlib.presentation.components.indicators.*
-import com.songlib.presentation.navigation.Routes
-import com.songlib.presentation.selection.SelectionViewModel
-import com.songlib.presentation.selection.components.Step1Fab
+import com.songlib.core.common.entity.UiState
+import com.songlib.core.data.repos.*
+import com.songlib.core.ui.components.action.AppTopBar
+import com.songlib.core.ui.components.indicators.*
+import com.songlib.core.common.utils.Routes
+import com.songlib.feature.selection.SelectionViewModel
+import com.songlib.feature.selection.components.Step1Fab
@OptIn(ExperimentalMaterial3Api::class)
@Composable
diff --git a/feature/settings/build.gradle.kts b/feature/settings/build.gradle.kts
new file mode 100644
index 0000000..649bec1
--- /dev/null
+++ b/feature/settings/build.gradle.kts
@@ -0,0 +1,12 @@
+plugins {
+ alias(libs.plugins.songlib.android.feature)
+}
+
+android {
+ namespace = "com.songlib.feature.settings"
+}
+
+dependencies {
+ implementation(project(":core:common"))
+ implementation(project(":core:data"))
+}
diff --git a/app/src/main/java/com/songlib/presentation/settings/SettingsViewModel.kt b/feature/settings/src/main/java/com/songlib/feature/settings/SettingsViewModel.kt
similarity index 85%
rename from app/src/main/java/com/songlib/presentation/settings/SettingsViewModel.kt
rename to feature/settings/src/main/java/com/songlib/feature/settings/SettingsViewModel.kt
index 412572d..0f4b30b 100644
--- a/app/src/main/java/com/songlib/presentation/settings/SettingsViewModel.kt
+++ b/feature/settings/src/main/java/com/songlib/feature/settings/SettingsViewModel.kt
@@ -1,11 +1,11 @@
-package com.songlib.presentation.settings
+package com.songlib.feature.settings
import androidx.compose.runtime.*
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.songlib.domain.repos.ListingRepo
-import com.songlib.domain.repos.PrefsRepo
-import com.songlib.domain.repos.SongBookRepo
+import com.songlib.core.data.repos.ListingRepo
+import com.songlib.core.data.repos.PrefsRepo
+import com.songlib.core.data.repos.SongBookRepo
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
diff --git a/app/src/main/java/com/songlib/presentation/settings/components/SettingsDialogs.kt b/feature/settings/src/main/java/com/songlib/feature/settings/components/SettingsDialogs.kt
similarity index 96%
rename from app/src/main/java/com/songlib/presentation/settings/components/SettingsDialogs.kt
rename to feature/settings/src/main/java/com/songlib/feature/settings/components/SettingsDialogs.kt
index 78fedd7..bd9c786 100644
--- a/app/src/main/java/com/songlib/presentation/settings/components/SettingsDialogs.kt
+++ b/feature/settings/src/main/java/com/songlib/feature/settings/components/SettingsDialogs.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.settings.components
+package com.songlib.feature.settings.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.fillMaxWidth
diff --git a/app/src/main/java/com/songlib/presentation/settings/view/SettingsScreen.kt b/feature/settings/src/main/java/com/songlib/feature/settings/view/SettingsScreen.kt
similarity index 88%
rename from app/src/main/java/com/songlib/presentation/settings/view/SettingsScreen.kt
rename to feature/settings/src/main/java/com/songlib/feature/settings/view/SettingsScreen.kt
index fe2f4e4..101fcc0 100644
--- a/app/src/main/java/com/songlib/presentation/settings/view/SettingsScreen.kt
+++ b/feature/settings/src/main/java/com/songlib/feature/settings/view/SettingsScreen.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.settings.view
+package com.songlib.feature.settings.view
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
@@ -9,14 +9,14 @@ import androidx.compose.material3.HorizontalDivider
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.navigation.NavHostController
-import com.songlib.domain.repos.ThemeRepository
-import com.songlib.domain.repos.ThemeSelectorDialog
-import com.songlib.domain.repos.appThemeName
-import com.songlib.presentation.components.action.AppTopBar
-import com.songlib.presentation.navigation.Routes
-import com.songlib.presentation.settings.SettingsViewModel
-import com.songlib.presentation.settings.components.ConfirmResetDialog
-import com.songlib.presentation.settings.components.SettingsSectionTitle
+import com.songlib.core.data.repos.ThemeRepository
+import com.songlib.core.data.repos.ThemeSelectorDialog
+import com.songlib.core.data.repos.appThemeName
+import com.songlib.core.ui.components.action.AppTopBar
+import com.songlib.core.common.utils.Routes
+import com.songlib.feature.settings.SettingsViewModel
+import com.songlib.feature.settings.components.ConfirmResetDialog
+import com.songlib.feature.settings.components.SettingsSectionTitle
@Composable
fun SettingsScreen(
diff --git a/feature/splash/build.gradle.kts b/feature/splash/build.gradle.kts
new file mode 100644
index 0000000..d3dc616
--- /dev/null
+++ b/feature/splash/build.gradle.kts
@@ -0,0 +1,12 @@
+plugins {
+ alias(libs.plugins.songlib.android.feature)
+}
+
+android {
+ namespace = "com.songlib.feature.splash"
+}
+
+dependencies {
+ implementation(project(":core:common"))
+ implementation(project(":core:data"))
+}
diff --git a/feature/splash/src/main/AndroidManifest.xml b/feature/splash/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f0f34af
--- /dev/null
+++ b/feature/splash/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/songlib/presentation/splash/SplashViewModel.kt b/feature/splash/src/main/java/com/songlib/feature/splash/SplashViewModel.kt
similarity index 91%
rename from app/src/main/java/com/songlib/presentation/splash/SplashViewModel.kt
rename to feature/splash/src/main/java/com/songlib/feature/splash/SplashViewModel.kt
index 937ce4c..a6802e6 100644
--- a/app/src/main/java/com/songlib/presentation/splash/SplashViewModel.kt
+++ b/feature/splash/src/main/java/com/songlib/feature/splash/SplashViewModel.kt
@@ -1,10 +1,10 @@
-package com.songlib.presentation.splash
+package com.songlib.feature.splash
import android.content.Context
import androidx.lifecycle.*
-import com.songlib.core.helpers.NetworkUtils
-import com.songlib.domain.repos.PrefsRepo
-import com.songlib.domain.repos.SubsRepo
+import com.songlib.core.common.helpers.NetworkUtils
+import com.songlib.core.data.repos.PrefsRepo
+import com.songlib.core.data.repos.SubsRepo
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
diff --git a/app/src/main/java/com/songlib/presentation/splash/components/SplashComponents.kt b/feature/splash/src/main/java/com/songlib/feature/splash/components/SplashComponents.kt
similarity index 97%
rename from app/src/main/java/com/songlib/presentation/splash/components/SplashComponents.kt
rename to feature/splash/src/main/java/com/songlib/feature/splash/components/SplashComponents.kt
index a0f743c..78a1006 100644
--- a/app/src/main/java/com/songlib/presentation/splash/components/SplashComponents.kt
+++ b/feature/splash/src/main/java/com/songlib/feature/splash/components/SplashComponents.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.splash.components
+package com.songlib.feature.splash.components
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
diff --git a/app/src/main/java/com/songlib/presentation/splash/view/SplashScreen.kt b/feature/splash/src/main/java/com/songlib/feature/splash/view/SplashScreen.kt
similarity index 93%
rename from app/src/main/java/com/songlib/presentation/splash/view/SplashScreen.kt
rename to feature/splash/src/main/java/com/songlib/feature/splash/view/SplashScreen.kt
index 6d07e6b..3b9be99 100644
--- a/app/src/main/java/com/songlib/presentation/splash/view/SplashScreen.kt
+++ b/feature/splash/src/main/java/com/songlib/feature/splash/view/SplashScreen.kt
@@ -1,4 +1,4 @@
-package com.songlib.presentation.splash.view
+package com.songlib.feature.splash.view
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
@@ -13,9 +13,9 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.*
import androidx.navigation.NavHostController
import com.songlib.R
-import com.songlib.presentation.navigation.Routes
-import com.songlib.presentation.splash.components.*
-import com.songlib.presentation.splash.SplashViewModel
+import com.songlib.core.common.utils.Routes
+import com.songlib.feature.splash.components.*
+import com.songlib.feature.splash.SplashViewModel
import kotlinx.coroutines.delay
@Composable
diff --git a/feature/splash/src/main/res/drawable/app_icon.png b/feature/splash/src/main/res/drawable/app_icon.png
new file mode 100644
index 0000000..6c61869
Binary files /dev/null and b/feature/splash/src/main/res/drawable/app_icon.png differ
diff --git a/feature/splash/src/main/res/drawable/empty.png b/feature/splash/src/main/res/drawable/empty.png
new file mode 100644
index 0000000..66ae11f
Binary files /dev/null and b/feature/splash/src/main/res/drawable/empty.png differ