/*
 * Copyright (C) 2016 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.
 */

// If you change this file, you should also change the settings gradle inside
// the sub project.

def inAppToolkitProject = rootProject.name == "app-toolkit"
def supportRoot
if (inAppToolkitProject) {
    supportRoot = new File(rootProject.projectDir, "..").getCanonicalFile()
} else {
    supportRoot = rootProject.projectDir
}

println "support root:${supportRoot}"

include ':arch:runtime'
project(':arch:runtime').projectDir = new File(supportRoot, "app-toolkit/runtime")

include ':arch:common'
project(':arch:common').projectDir = new File(supportRoot, "app-toolkit/common")

include ':paging:common'
project(':paging:common').projectDir = new File(supportRoot, "paging/common")

include ":paging:runtime"
project(':paging:runtime').projectDir = new File(supportRoot, "paging/runtime")

include ':paging:integration-tests:testapp'
project(':paging:integration-tests:testapp').projectDir = new File(supportRoot, "paging/integration-tests/testapp")

include ':arch:core-testing'
project(':arch:core-testing').projectDir = new File(supportRoot, "app-toolkit/core-testing")

include ':lifecycle:livedata-core'
project(':lifecycle:livedata-core').projectDir = new File(supportRoot, "lifecycle/livedata-core")

include ':lifecycle:livedata'
project(':lifecycle:livedata').projectDir = new File(supportRoot, "lifecycle/livedata")

include ':lifecycle:viewmodel'
project(':lifecycle:viewmodel').projectDir = new File(supportRoot, "lifecycle/viewmodel")

include ':lifecycle:extensions'
project(':lifecycle:extensions').projectDir = new File(supportRoot, "lifecycle/extensions")

include ':lifecycle:extensions'
project(':lifecycle:extensions').projectDir = new File(supportRoot, "lifecycle/extensions")

include ':lifecycle:reactivestreams'
project(':lifecycle:reactivestreams').projectDir = new File(supportRoot, "lifecycle/reactivestreams")

include ':lifecycle:runtime'
project(':lifecycle:runtime').projectDir = new File(supportRoot, "lifecycle/runtime")

include ':lifecycle:common'
project(':lifecycle:common').projectDir = new File(supportRoot, "lifecycle/common")

include ':lifecycle:common-java8'
project(':lifecycle:common-java8').projectDir = new File(supportRoot, "lifecycle/common-java8")

include ':lifecycle:compiler'
project(':lifecycle:compiler').projectDir = new File(supportRoot, "lifecycle/compiler")

include ':lifecycle:integration-tests:testapp'
project(':lifecycle:integration-tests:testapp').projectDir = new File(supportRoot, "lifecycle/integration-tests/testapp")

include ':room:common'
project(':room:common').projectDir = new File(supportRoot, "room/common")

include ':room:runtime'
project(':room:runtime').projectDir = new File(supportRoot, "room/runtime")

include ':room:compiler'
project(':room:compiler').projectDir = new File(supportRoot, "room/compiler")

include ':room:migration'
project(':room:migration').projectDir = new File(supportRoot, "room/migration")

include ':persistence:db'
project(':persistence:db').projectDir = new File(supportRoot, "persistence/db")

include ":persistence:db-framework"
project(':persistence:db-framework').projectDir = new File(supportRoot, "persistence/db-framework")

include ":room:guava"
project(':room:guava').projectDir = new File(supportRoot, "room/guava")

include ":room:testing"
project(':room:testing').projectDir = new File(supportRoot, "room/testing")

include ":room:rxjava2"
project(':room:rxjava2').projectDir = new File(supportRoot, "room/rxjava2")

include ':room:integration-tests:testapp'
project(':room:integration-tests:testapp').projectDir = new File(supportRoot, "room/integration-tests/testapp")

include ':room:integration-tests:kotlintestapp'
project(':room:integration-tests:kotlintestapp').projectDir = new File(supportRoot, "room/integration-tests/kotlintestapp")

include ':work:work-runtime'
project(':work:work-runtime').projectDir = new File(supportRoot, "work/workmanager")

include ':work:work-firebase'
project(':work:work-firebase').projectDir = new File(supportRoot, "work/workmanager-firebase")

include ':work:integration-tests:testapp'
project(':work:integration-tests:testapp').projectDir = new File(supportRoot, "work/integration-tests/testapp")

/////////////////////////////
//
// External
//
/////////////////////////////
if (inAppToolkitProject) {
    File externalRoot = new File(supportRoot, '../../external')

    includeBuild new File(externalRoot, 'doclava')

    includeBuild new File(externalRoot, 'jdiff')
}
