Clean up: use constants where we should be using them.
[android/platform/tools/build.git] / builder / src / main / java / com / android / builder / ProductFlavor.java
1 /*
2  * Copyright (C) 2012 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 com.android.builder;
18
19 import com.android.annotations.NonNull;
20 import com.android.builder.signing.SigningConfig;
21 import com.google.common.base.Objects;
22
23 /**
24  * The configuration of a product flavor.
25  *
26  * This is also used to describe the default configuration of all builds, even those that
27  * do not contain any flavors.
28  */
29 public class ProductFlavor extends BuildConfig {
30     private static final long serialVersionUID = 1L;
31
32     private final String mName;
33     private int mMinSdkVersion = -1;
34     private int mTargetSdkVersion = -1;
35     private int mRenderscriptTargetApi = -1;
36     private int mVersionCode = -1;
37     private String mVersionName = null;
38     private String mPackageName = null;
39     private String mTestPackageName = null;
40     private String mTestInstrumentationRunner = null;
41     private SigningConfig mSigningConfig = null;
42
43     /**
44      * Creates a ProductFlavor with a given name.
45      *
46      * Names can be important when dealing with flavor groups.
47      * @param name the name of the flavor.
48      *
49      * @see BuilderConstants#MAIN
50      */
51     public ProductFlavor(@NonNull String name) {
52         mName = name;
53     }
54
55     public String getName() {
56         return mName;
57     }
58
59     /**
60      * Sets the package name.
61      *
62      * @param packageName the package name
63      * @return the flavor object
64      */
65     public ProductFlavor setPackageName(String packageName) {
66         mPackageName = packageName;
67         return this;
68     }
69
70     public String getPackageName() {
71         return mPackageName;
72     }
73
74     /**
75      * Sets the version code. If the value is -1, it is considered not set.
76      *
77      * @param versionCode the version code
78      * @return the flavor object
79      */
80     public ProductFlavor setVersionCode(int versionCode) {
81         mVersionCode = versionCode;
82         return this;
83     }
84
85     public int getVersionCode() {
86         return mVersionCode;
87     }
88
89     /**
90      * Sets the version name.
91      *
92      * @param versionName the version name
93      * @return the flavor object
94      */
95     public ProductFlavor setVersionName(String versionName) {
96         mVersionName = versionName;
97         return this;
98     }
99
100     public String getVersionName() {
101         return mVersionName;
102     }
103
104     public ProductFlavor setMinSdkVersion(int minSdkVersion) {
105         mMinSdkVersion = minSdkVersion;
106         return this;
107     }
108
109     public int getMinSdkVersion() {
110         return mMinSdkVersion;
111     }
112
113     public ProductFlavor setTargetSdkVersion(int targetSdkVersion) {
114         mTargetSdkVersion = targetSdkVersion;
115         return this;
116     }
117
118     public int getTargetSdkVersion() {
119         return mTargetSdkVersion;
120     }
121
122     public int getRenderscriptTargetApi() {
123         return mRenderscriptTargetApi;
124     }
125
126     public void setRenderscriptTargetApi(int renderscriptTargetApi) {
127         mRenderscriptTargetApi = renderscriptTargetApi;
128     }
129
130     public ProductFlavor setTestPackageName(String testPackageName) {
131         mTestPackageName = testPackageName;
132         return this;
133     }
134
135     public String getTestPackageName() {
136         return mTestPackageName;
137     }
138
139     public ProductFlavor setTestInstrumentationRunner(String testInstrumentationRunner) {
140         mTestInstrumentationRunner = testInstrumentationRunner;
141         return this;
142     }
143
144     public String getTestInstrumentationRunner() {
145         return mTestInstrumentationRunner;
146     }
147
148     public SigningConfig getSigningConfig() {
149         return mSigningConfig;
150     }
151
152     public ProductFlavor setSigningConfig(SigningConfig signingConfig) {
153         mSigningConfig = signingConfig;
154         return this;
155     }
156
157     /**
158      * Merges the flavor on top of a base platform and returns a new object with the result.
159      * @param base the flavor to merge on top of
160      * @return a new merged product flavor
161      */
162     ProductFlavor mergeOver(@NonNull ProductFlavor base) {
163         ProductFlavor flavor = new ProductFlavor("");
164
165         flavor.mMinSdkVersion = chooseInt(mMinSdkVersion, base.mMinSdkVersion);
166         flavor.mTargetSdkVersion = chooseInt(mTargetSdkVersion, base.mTargetSdkVersion);
167         flavor.mRenderscriptTargetApi = chooseInt(mRenderscriptTargetApi,
168                 base.mRenderscriptTargetApi);
169
170         flavor.mVersionCode = chooseInt(mVersionCode, base.mVersionCode);
171         flavor.mVersionName = chooseString(mVersionName, base.mVersionName);
172
173         flavor.mPackageName = chooseString(mPackageName, base.mPackageName);
174
175         flavor.mTestPackageName = chooseString(mTestPackageName, base.mTestPackageName);
176         flavor.mTestInstrumentationRunner = chooseString(mTestInstrumentationRunner,
177                 base.mTestInstrumentationRunner);
178
179         flavor.mSigningConfig =
180                 mSigningConfig != null ? mSigningConfig : base.mSigningConfig;
181
182         return flavor;
183     }
184
185     private int chooseInt(int overlay, int base) {
186         return overlay != -1 ? overlay : base;
187     }
188
189     private String chooseString(String overlay, String base) {
190         return overlay != null ? overlay : base;
191     }
192
193     @Override
194     public boolean equals(Object o) {
195         if (this == o) return true;
196         if (o == null || getClass() != o.getClass()) return false;
197         if (!super.equals(o)) return false;
198
199         ProductFlavor that = (ProductFlavor) o;
200
201         if (!mName.equals(that.mName)) return false;
202         if (mMinSdkVersion != that.mMinSdkVersion) return false;
203         if (mTargetSdkVersion != that.mTargetSdkVersion) return false;
204         if (mRenderscriptTargetApi != that.mRenderscriptTargetApi) return false;
205         if (mVersionCode != that.mVersionCode) return false;
206         if (mPackageName != null ?
207                 !mPackageName.equals(that.mPackageName) :
208                 that.mPackageName != null)
209             return false;
210         if (mTestInstrumentationRunner != null ?
211                 !mTestInstrumentationRunner.equals(that.mTestInstrumentationRunner) :
212                 that.mTestInstrumentationRunner != null)
213             return false;
214         if (mTestPackageName != null ?
215                 !mTestPackageName.equals(that.mTestPackageName) : that.mTestPackageName != null)
216             return false;
217         if (mVersionName != null ?
218                 !mVersionName.equals(that.mVersionName) : that.mVersionName != null)
219             return false;
220         if (mSigningConfig != null ?
221                 !mSigningConfig.equals(that.mSigningConfig) : that.mSigningConfig != null)
222             return false;
223
224         return true;
225     }
226
227     @Override
228     public int hashCode() {
229         int result = super.hashCode();
230         result = 31 * result + mName.hashCode();
231         result = 31 * result + mMinSdkVersion;
232         result = 31 * result + mTargetSdkVersion;
233         result = 31 * result + mRenderscriptTargetApi;
234         result = 31 * result + mVersionCode;
235         result = 31 * result + (mVersionName != null ? mVersionName.hashCode() : 0);
236         result = 31 * result + (mPackageName != null ? mPackageName.hashCode() : 0);
237         result = 31 * result + (mTestPackageName != null ? mTestPackageName.hashCode() : 0);
238         result = 31 * result + (mTestInstrumentationRunner != null ?
239                 mTestInstrumentationRunner.hashCode() : 0);
240         result = 31 * result + (mSigningConfig != null ? mSigningConfig.hashCode() : 0);
241         return result;
242     }
243
244     @Override
245     public String toString() {
246         return Objects.toStringHelper(this)
247                 .add("name", mName)
248                 .add("minSdkVersion", mMinSdkVersion)
249                 .add("targetSdkVersion", mTargetSdkVersion)
250                 .add("renderscriptTargetApi", mRenderscriptTargetApi)
251                 .add("versionCode", mVersionCode)
252                 .add("versionName", mVersionName)
253                 .add("packageName", mPackageName)
254                 .add("testPackageName", mTestPackageName)
255                 .add("testInstrumentationRunner", mTestInstrumentationRunner)
256                 .add("signingConfig", mSigningConfig)
257                 .toString();
258     }
259
260     /*
261         release signing info (keystore, key alias, passwords,...).
262         native abi filter
263     */
264
265 }