1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
/*
* Copyright (C) 2011 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.
*/
package com.android.builder.internal;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.google.common.collect.Maps;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Class able to generate a BuildConfig class in Android project.
* The BuildConfig class contains constants related to the build target.
*/
public class BuildConfigGenerator {
private final static String TEMPLATE = "BuildConfig.template";
private final static String PH_PACKAGE = "#PACKAGE#";
private final static String PH_DEBUG = "#DEBUG#";
private final static String PH_LINES = "#ADDITIONAL_LINES#";
private final String mGenFolder;
private final String mAppPackage;
private final boolean mDebug;
public final static String BUILD_CONFIG_NAME = "BuildConfig.java";
/**
* Creates a generator
* @param genFolder the gen folder of the project
* @param appPackage the application package
* @param debug whether it's a debug build
*/
public BuildConfigGenerator(@NonNull String genFolder, @NonNull String appPackage,
boolean debug) {
mGenFolder = checkNotNull(genFolder);
mAppPackage = checkNotNull(appPackage);
mDebug = debug;
}
/**
* Returns a File representing where the BuildConfig class will be.
*/
public File getFolderPath() {
File genFolder = new File(mGenFolder);
return new File(genFolder, mAppPackage.replace('.', File.separatorChar));
}
public File getBuildConfigFile() {
File folder = getFolderPath();
return new File(folder, BUILD_CONFIG_NAME);
}
/**
* Generates the BuildConfig class.
* @param additionalLines a list of additional lines to be added to the class.
*/
public void generate(@Nullable List<String> additionalLines) throws IOException {
Map<String, String> map = Maps.newHashMap();
map.put(PH_PACKAGE, mAppPackage);
// Hack (see IDEA-100046): We want to avoid reporting "condition is always true"
// from the data flow inspection, so use a non-constant value. However, that defeats
// the purpose of this flag (when not in debug mode, if (BuildConfig.DEBUG && ...) will
// be completely removed by the compiler), so as a hack we do it only for the case
// where debug is true, which is the most likely scenario while the user is looking
// at source code.
//map.put(PH_DEBUG, Boolean.toString(mDebug));
map.put(PH_DEBUG, mDebug ? "Boolean.parseBoolean(\"true\")" : "false");
if (additionalLines != null) {
StringBuilder sb = new StringBuilder();
for (String line : additionalLines) {
sb.append(" ").append(line).append('\n');
}
map.put(PH_LINES, sb.toString());
} else {
map.put(PH_LINES, "");
}
File pkgFolder = getFolderPath();
if (!pkgFolder.isDirectory()) {
pkgFolder.mkdirs();
}
File buildConfigJava = new File(pkgFolder, BUILD_CONFIG_NAME);
TemplateProcessor processor = new TemplateProcessor(
BuildConfigGenerator.class.getResourceAsStream(TEMPLATE), map);
processor.generate(buildConfigJava);
}
}
|