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