Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .idea/deploymentTargetSelector.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added .idea/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .idea/icon_dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
24 changes: 10 additions & 14 deletions app/src/main/java/com/songlib/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -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)

Expand All @@ -36,4 +32,4 @@ class MainActivity : ComponentActivity() {
}
}
}
}
}
17 changes: 6 additions & 11 deletions app/src/main/java/com/songlib/SongLibApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,18 @@ 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() {

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()
)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,26 @@
package com.songlib.presentation.navigation
package com.songlib.app.navigation

import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.runtime.*
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
Expand Down
10 changes: 0 additions & 10 deletions app/src/main/java/com/songlib/presentation/navigation/Routes.kt

This file was deleted.

52 changes: 52 additions & 0 deletions build-logic/convention/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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<PluginDependency>.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"
}
}
}
Original file line number Diff line number Diff line change
@@ -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<Project> {
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())
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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<Project> {
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<LibraryExtension> {
buildFeatures { compose = true }
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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<Project> {
override fun apply(target: Project) {
with(target) {
with(pluginManager) {
apply("com.android.library")
apply("org.jetbrains.kotlin.android")
}
extensions.configure<LibraryExtension> {
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)
}
}
17 changes: 17 additions & 0 deletions build-logic/convention/src/main/kotlin/HiltConventionPlugin.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies

class HiltConventionPlugin : Plugin<Project> {
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")
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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<VersionCatalogsExtension>().named("libs")
15 changes: 15 additions & 0 deletions build-logic/settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
}
versionCatalogs {
create("libs") {
from(files("../gradle/libs.versions.toml"))
}
}
}

rootProject.name = "build-logic"

include(":convention")
13 changes: 13 additions & 0 deletions core/common/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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)
}
4 changes: 4 additions & 0 deletions core/common/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.songlib.domain.entity
package com.songlib.core.common.entity

data class Selectable<T>(
val data: T,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.songlib.domain.entity
package com.songlib.core.common.entity

sealed class UiState {
object Idle : UiState()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.songlib.core.helpers
package com.songlib.core.common.helpers

import android.content.Context
import android.net.*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.songlib.core.utils
package com.songlib.core.common.utils

object ApiConstants {
const val BASE = "https://songlive.vercel.app/"
Expand Down Expand Up @@ -30,4 +30,13 @@ object PrefConstants {
const val THEME_MODE = "themeMode"
const val HORIZONTAL_SLIDES = "horizontalSlides"
const val LAST_APP_OPEN_TIME = "lastAppOpenTime"
}
}

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"
}
Loading