1 /*
<lambda>null2  * Copyright 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package androidx.build.resources
18 
19 import androidx.build.checkapi.ApiLocation
20 import java.io.File
21 import org.gradle.api.DefaultTask
22 import org.gradle.api.provider.ListProperty
23 import org.gradle.api.provider.Property
24 import org.gradle.api.tasks.CacheableTask
25 import org.gradle.api.tasks.Input
26 import org.gradle.api.tasks.InputFile
27 import org.gradle.api.tasks.Internal
28 import org.gradle.api.tasks.OutputFiles
29 import org.gradle.api.tasks.PathSensitive
30 import org.gradle.api.tasks.PathSensitivity
31 import org.gradle.api.tasks.TaskAction
32 
33 /** Task for updating the public Android resource surface, e.g. `public.xml`. */
34 @CacheableTask
35 abstract class UpdateResourceApiTask : DefaultTask() {
36     /** Generated resource API file (in build output). */
37     @get:Internal abstract val apiLocation: Property<ApiLocation>
38 
39     @get:Input abstract val forceUpdate: Property<Boolean>
40 
41     @InputFile
42     @PathSensitive(PathSensitivity.RELATIVE)
43     fun getTaskInput(): File {
44         return apiLocation.get().resourceFile
45     }
46 
47     /** Resource API files to which APIs should be written (in source control). */
48     @get:Internal // outputs are declared in getTaskOutputs()
49     abstract val outputApiLocations: ListProperty<ApiLocation>
50 
51     @OutputFiles
52     fun getTaskOutputs(): List<File> {
53         return outputApiLocations.get().flatMap { outputApiLocation ->
54             listOf(outputApiLocation.resourceFile)
55         }
56     }
57 
58     @TaskAction
59     fun updateResourceApi() {
60         var permitOverwriting = true
61         for (outputApi in outputApiLocations.get()) {
62             val version = outputApi.version()
63             if (
64                 version != null &&
65                     version.isFinalApi() &&
66                     outputApi.publicApiFile.exists() &&
67                     !forceUpdate.get()
68             ) {
69                 permitOverwriting = false
70             }
71         }
72 
73         val inputApi = apiLocation.get().resourceFile
74 
75         for (outputApi in outputApiLocations.get()) {
76             androidx.build.metalava.copy(
77                 inputApi,
78                 outputApi.resourceFile,
79                 permitOverwriting,
80                 logger
81             )
82         }
83     }
84 }
85