/*
 * Copyright 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * This file was created using the `create_project.py` script located in the
 * `<AndroidX root>/development/project-creator` directory.
 *
 * Please use that script when creating a new project, rather than copying an existing project and
 * modifying its settings.
 */
import androidx.build.LibraryType
import androidx.build.PlatformIdentifier

plugins {
    id("AndroidXPlugin")
    id("com.android.library")
    id("AndroidXComposePlugin")
}

androidXMultiplatform {
    android()
    desktop()

    defaultPlatform(PlatformIdentifier.ANDROID)

    sourceSets {
        commonMain {
            dependencies {
                api(projectOrArtifact(":lifecycle:lifecycle-common"))
                api(projectOrArtifact(":lifecycle:lifecycle-viewmodel"))
                api(projectOrArtifact(":annotation:annotation"))
                api("androidx.compose.runtime:runtime:1.6.0")
                api("androidx.compose.ui:ui:1.6.0")
                implementation(libs.kotlinStdlib)
            }
        }

        commonTest {
            // TODO(b/330323282): Move common dependencies here.
        }

        androidMain {
            dependsOn(commonMain)
            dependencies {
                api(projectOrArtifact(":lifecycle:lifecycle-viewmodel-savedstate"))
                // Converting `lifecycle-viewmodel-compose` to KMP and including a transitive
                // dependency on `lifecycle-livedata-core` triggered a Gradle bug. Adding the
                // `livedata` dependency directly works around the issue.
                // See https://github.com/gradle/gradle/issues/14220 for details.
                compileOnly(projectOrArtifact(":lifecycle:lifecycle-livedata-core"))
            }
        }

        androidInstrumentedTest {
            dependsOn(commonTest)
            dependencies {
                implementation(projectOrArtifact(":compose:ui:ui-test-junit4"))
                implementation(project(":compose:test-utils"))
                implementation(libs.testRules)
                implementation(libs.testRunner)
                implementation(libs.junit)
                implementation(libs.truth)
                implementation("androidx.fragment:fragment:1.3.0")
                implementation("androidx.appcompat:appcompat:1.3.0")
                // old version of common-java8 conflicts with newer version, because both have
                // DefaultLifecycleEventObserver.
                // Outside of androidx this is resolved via constraint added to lifecycle-common,
                // but it doesn't work in androidx.
                // See aosp/1804059
                implementation(projectOrArtifact(":lifecycle:lifecycle-common-java8"))
                implementation(projectOrArtifact(":lifecycle:lifecycle-viewmodel-savedstate"))
                implementation(projectOrArtifact(":activity:activity-compose"))
                implementation(projectOrArtifact(":lifecycle:lifecycle-runtime-testing"))
            }
        }
    }
}

androidx {
    name = "Lifecycle ViewModel Compose"
    type = LibraryType.PUBLISHED_LIBRARY_ONLY_USED_BY_KOTLIN_CONSUMERS
    inceptionYear = "2021"
    description = "Compose integration with Lifecycle ViewModel"
    samples(projectOrArtifact(":lifecycle:lifecycle-viewmodel-compose:lifecycle-viewmodel-compose-samples"))
}

android {
    namespace "androidx.lifecycle.viewmodel.compose"
}
