| // Copyright 2016 The Bazel Authors. All rights reserved. |
| // |
| // 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. |
| package com.google.devtools.build.android; |
| |
| import com.android.resources.ResourceType; |
| import com.google.common.annotations.VisibleForTesting; |
| import com.google.common.base.Optional; |
| import com.google.devtools.build.android.AndroidFrameworkAttrIdProvider.AttrLookupException; |
| import com.google.devtools.build.android.resources.FieldInitializers; |
| import com.google.devtools.build.android.resources.RClassGenerator; |
| import com.google.devtools.build.android.resources.RSourceGenerator; |
| import java.io.Flushable; |
| import java.io.IOException; |
| import java.nio.file.Path; |
| import java.util.Map; |
| |
| /** |
| * Generates the R class for an android_library with made up field initializers for the ids. The |
| * real ids will be assigned when we build the android_binary. |
| * |
| * <p>Collects the R class fields from the merged resource maps, and then writes out the resource |
| * class files. |
| */ |
| public class AndroidResourceClassWriter implements Flushable, AndroidResourceSymbolSink { |
| |
| /** Create a new class writer. */ |
| public static AndroidResourceClassWriter createWith( |
| Path androidJar, Path out, String javaPackage) { |
| return of(new AndroidFrameworkAttrIdJar(androidJar), out, javaPackage); |
| } |
| |
| @VisibleForTesting |
| public static AndroidResourceClassWriter of( |
| AndroidFrameworkAttrIdProvider androidIdProvider, Path outputBasePath, String packageName) { |
| return new AndroidResourceClassWriter( |
| PlaceholderIdFieldInitializerBuilder.from(androidIdProvider), outputBasePath, packageName); |
| } |
| |
| private final Path outputBasePath; |
| private final String packageName; |
| private boolean includeClassFile = true; |
| private boolean includeJavaFile = true; |
| |
| private final PlaceholderIdFieldInitializerBuilder generator; |
| |
| private AndroidResourceClassWriter( |
| PlaceholderIdFieldInitializerBuilder generator, Path outputBasePath, String packageName) { |
| this.generator = generator; |
| this.outputBasePath = outputBasePath; |
| this.packageName = packageName; |
| } |
| |
| public void setIncludeClassFile(boolean include) { |
| this.includeClassFile = include; |
| } |
| |
| public void setIncludeJavaFile(boolean include) { |
| this.includeJavaFile = include; |
| } |
| |
| @Override |
| public void acceptSimpleResource(ResourceType type, String name) { |
| generator.addSimpleResource(type, name); |
| } |
| |
| @Override |
| public void acceptPublicResource(ResourceType type, String name, Optional<Integer> value) { |
| generator.addPublicResource(type, name, value); |
| } |
| |
| @Override |
| public void acceptStyleableResource( |
| FullyQualifiedName key, Map<FullyQualifiedName, Boolean> attrs) { |
| generator.addStyleableResource(key, attrs); |
| } |
| |
| @Override |
| public void flush() throws IOException { |
| try { |
| FieldInitializers initializers = generator.build(); |
| if (includeClassFile) { |
| writeAsClass(initializers); |
| } |
| if (includeJavaFile) { |
| writeAsJava(initializers); |
| } |
| } catch (AttrLookupException e) { |
| throw new IOException(e); |
| } |
| } |
| |
| private void writeAsJava(FieldInitializers initializers) throws IOException { |
| RSourceGenerator.with(outputBasePath, initializers, /* finalFields= */ false) |
| .write(packageName); |
| } |
| |
| private void writeAsClass(FieldInitializers initializers) throws IOException { |
| RClassGenerator.with(outputBasePath, initializers, /* finalFields= */ false).write(packageName); |
| } |
| } |