001/**
002 * Copyright 2013 John Ericksen
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *    http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.androidtransfuse.model.manifest;
017
018import org.androidtransfuse.annotations.LaunchMode;
019import org.androidtransfuse.annotations.ScreenOrientation;
020import org.androidtransfuse.annotations.UIOptions;
021import org.androidtransfuse.annotations.WindowSoftInputMode;
022import org.androidtransfuse.model.Identified;
023import org.androidtransfuse.model.Mergeable;
024import org.androidtransfuse.processor.Merge;
025import org.androidtransfuse.processor.MergeCollection;
026import org.apache.commons.lang.builder.EqualsBuilder;
027
028import javax.xml.bind.annotation.XmlAttribute;
029import javax.xml.bind.annotation.XmlElement;
030import javax.xml.bind.annotation.XmlTransient;
031import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
032import java.util.ArrayList;
033import java.util.List;
034
035/**
036 * attributes:
037 * android:allowTaskReparenting=["true" | "false"]
038 * android:alwaysRetainTaskState=["true" | "false"]
039 * android:clearTaskOnLaunch=["true" | "false"]
040 * android:configChanges=["mcc", "mnc", "locale",
041 * "touchscreen", "keyboard", "keyboardHidden",
042 * "navigation", "screenLayout", "fontScale", "uiMode",
043 * "orientation", "screenSize", "smallestScreenSize"]
044 * android:enabled=["true" | "false"]
045 * android:excludeFromRecents=["true" | "false"]
046 * android:exported=["true" | "false"]
047 * android:finishOnTaskLaunch=["true" | "false"]
048 * android:hardwareAccelerated=["true" | "false"]
049 * android:icon="drawable resource"
050 * android:label="string resource"
051 * android:launchMode=["multiple" | "singleTop" |
052 * "singleTask" | "singleInstance"]
053 * android:multiprocess=["true" | "false"]
054 * android:name="string"
055 * android:noHistory=["true" | "false"]
056 * android:permission="string"
057 * android:process="string"
058 * android:screenOrientation=["unspecified" | "user" | "behind" |
059 * "landscape" | "portrait" |
060 * "reverseLandscape" | "reversePortrait" |
061 * "sensorLandscape" | "sensorPortrait" |
062 * "sensor" | "fullSensor" | "nosensor"]
063 * android:stateNotNeeded=["true" | "false"]
064 * android:taskAffinity="string"
065 * android:theme="resource or theme"
066 * android:uiOptions=["none" | "splitActionBarWhenNarrow"]
067 * android:windowSoftInputMode=["stateUnspecified",
068 * "stateUnchanged", "stateHidden",
069 * "stateAlwaysHidden", "stateVisible",
070 * "stateAlwaysVisible", "adjustUnspecified",
071 * "adjustResize", "adjustPan"]
072 * <p/>
073 * can contain:
074 * <intent-filter>
075 * <meta-data>
076 *
077 * @author John Ericksen
078 */
079public class Activity extends Mergeable implements Comparable<Activity>, Identified {
080
081    private Boolean allowTaskReparenting;
082    private Boolean alwaysRetainTaskState;
083    private Boolean clearTaskOnLaunch;
084    private String configChanges;
085    private Boolean enabled;
086    private Boolean excludeFromRecents;
087    private Boolean exported;
088    private Boolean finishOnTaskLaunch;
089    private Boolean hardwareAccelerated;
090    private String icon;
091    private String label;
092    private LaunchMode launchMode;
093    private Boolean multiprocess;
094    private String name;
095    private Boolean noHistory;
096    private String permission;
097    private String process;
098    private ScreenOrientation screenOrientation;
099    private Boolean stateNotNeeded;
100    private String taskAffinity;
101    private String theme;
102    private UIOptions uiOptions;
103    private WindowSoftInputMode windowSoftInputMode;
104    private List<IntentFilter> intentFilters = new ArrayList<IntentFilter>();
105    private List<MetaData> metaData = new ArrayList<MetaData>();
106
107    @Merge("t")
108    @XmlAttribute(name = "allowTaskReparenting", namespace = ManifestNamespaceMapper.ANDROID_URI)
109    public Boolean getAllowTaskReparenting() {
110        return allowTaskReparenting;
111    }
112
113    public void setAllowTaskReparenting(Boolean allowTaskReparenting) {
114        this.allowTaskReparenting = allowTaskReparenting;
115    }
116
117    @Merge("s")
118    @XmlAttribute(name = "alwaysRetainTaskState", namespace = ManifestNamespaceMapper.ANDROID_URI)
119    public Boolean getAlwaysRetainTaskState() {
120        return alwaysRetainTaskState;
121    }
122
123    public void setAlwaysRetainTaskState(Boolean alwaysRetainTaskState) {
124        this.alwaysRetainTaskState = alwaysRetainTaskState;
125    }
126
127    @Merge("c")
128    @XmlAttribute(name = "clearTaskOnLaunch", namespace = ManifestNamespaceMapper.ANDROID_URI)
129    public Boolean getClearTaskOnLaunch() {
130        return clearTaskOnLaunch;
131    }
132
133    public void setClearTaskOnLaunch(Boolean clearTaskOnLaunch) {
134        this.clearTaskOnLaunch = clearTaskOnLaunch;
135    }
136
137    @Merge("a")
138    @XmlAttribute(name = "configChanges", namespace = ManifestNamespaceMapper.ANDROID_URI)
139    public String getConfigChanges() {
140        return configChanges;
141    }
142
143    public void setConfigChanges(String configChanges) {
144        this.configChanges = configChanges;
145    }
146
147    @Merge("e")
148    @XmlAttribute(name = "enabled", namespace = ManifestNamespaceMapper.ANDROID_URI)
149    public Boolean getEnabled() {
150        return enabled;
151    }
152
153    public void setEnabled(Boolean enabled) {
154        this.enabled = enabled;
155    }
156
157    @Merge("r")
158    @XmlAttribute(name = "excludeFromRecents", namespace = ManifestNamespaceMapper.ANDROID_URI)
159    public Boolean getExcludeFromRecents() {
160        return excludeFromRecents;
161    }
162
163    public void setExcludeFromRecents(Boolean excludeFromRecents) {
164        this.excludeFromRecents = excludeFromRecents;
165    }
166
167    @Merge("x")
168    @XmlAttribute(name = "exported", namespace = ManifestNamespaceMapper.ANDROID_URI)
169    public Boolean getExported() {
170        return exported;
171    }
172
173    public void setExported(Boolean exported) {
174        this.exported = exported;
175    }
176
177    @Merge("f")
178    @XmlAttribute(name = "finishOnTaskLaunch", namespace = ManifestNamespaceMapper.ANDROID_URI)
179    public Boolean getFinishOnTaskLaunch() {
180        return finishOnTaskLaunch;
181    }
182
183    public void setFinishOnTaskLaunch(Boolean finishOnTaskLaunch) {
184        this.finishOnTaskLaunch = finishOnTaskLaunch;
185    }
186
187    @Merge("j")
188    @XmlAttribute(name = "hardwareAccelerated", namespace = ManifestNamespaceMapper.ANDROID_URI)
189    public Boolean getHardwareAccelerated() {
190        return hardwareAccelerated;
191    }
192
193    public void setHardwareAccelerated(Boolean hardwareAccelerated) {
194        this.hardwareAccelerated = hardwareAccelerated;
195    }
196
197    @Merge("i")
198    @XmlAttribute(name = "icon", namespace = ManifestNamespaceMapper.ANDROID_URI)
199    public String getIcon() {
200        return icon;
201    }
202
203    public void setIcon(String icon) {
204        this.icon = icon;
205    }
206
207    @Merge("l")
208    @XmlAttribute(name = "label", namespace = ManifestNamespaceMapper.ANDROID_URI)
209    public String getLabel() {
210        return label;
211    }
212
213    public void setLabel(String label) {
214        this.label = label;
215    }
216
217    @Merge("u")
218    @XmlAttribute(name = "launchMode", namespace = ManifestNamespaceMapper.ANDROID_URI)
219    @XmlJavaTypeAdapter(LabeledConverter.LaunchModeConverter.class)
220    public LaunchMode getLaunchMode() {
221        return launchMode;
222    }
223
224    public void setLaunchMode(LaunchMode launchMode) {
225        this.launchMode = launchMode;
226    }
227
228    @Merge("m")
229    @XmlAttribute(name = "multiprocess", namespace = ManifestNamespaceMapper.ANDROID_URI)
230    public Boolean getMultiprocess() {
231        return multiprocess;
232    }
233
234    public void setMultiprocess(Boolean multiprocess) {
235        this.multiprocess = multiprocess;
236    }
237
238    @Merge("n")
239    @XmlAttribute(name = "name", namespace = ManifestNamespaceMapper.ANDROID_URI)
240    public String getName() {
241        return name;
242    }
243
244    public void setName(String name) {
245        this.name = name;
246    }
247
248    @Merge("v")
249    @XmlAttribute(name = "noHistory", namespace = ManifestNamespaceMapper.ANDROID_URI)
250    public Boolean getNoHistory() {
251        return noHistory;
252    }
253
254    public void setNoHistory(Boolean noHistory) {
255        this.noHistory = noHistory;
256    }
257
258    @Merge("p")
259    @XmlAttribute(name = "permission", namespace = ManifestNamespaceMapper.ANDROID_URI)
260    public String getPermission() {
261        return permission;
262    }
263
264    public void setPermission(String permission) {
265        this.permission = permission;
266    }
267
268    @Merge("o")
269    @XmlAttribute(name = "process", namespace = ManifestNamespaceMapper.ANDROID_URI)
270    public String getProcess() {
271        return process;
272    }
273
274    public void setProcess(String process) {
275        this.process = process;
276    }
277
278    @Merge("g")
279    @XmlAttribute(name = "screenOrientation", namespace = ManifestNamespaceMapper.ANDROID_URI)
280    @XmlJavaTypeAdapter(LabeledConverter.ScreenOrientationConverter.class)
281    public ScreenOrientation getScreenOrientation() {
282        return screenOrientation;
283    }
284
285    public void setScreenOrientation(ScreenOrientation screenOrientation) {
286        this.screenOrientation = screenOrientation;
287    }
288
289    @Merge("d")
290    @XmlAttribute(name = "stateNotNeeded", namespace = ManifestNamespaceMapper.ANDROID_URI)
291    public Boolean getStateNotNeeded() {
292        return stateNotNeeded;
293    }
294
295    public void setStateNotNeeded(Boolean stateNotNeeded) {
296        this.stateNotNeeded = stateNotNeeded;
297    }
298
299    @Merge("y")
300    @XmlAttribute(name = "taskAffinity", namespace = ManifestNamespaceMapper.ANDROID_URI)
301    public String getTaskAffinity() {
302        return taskAffinity;
303    }
304
305    public void setTaskAffinity(String taskAffinity) {
306        this.taskAffinity = taskAffinity;
307    }
308
309    @Merge("h")
310    @XmlAttribute(name = "theme", namespace = ManifestNamespaceMapper.ANDROID_URI)
311    public String getTheme() {
312        return theme;
313    }
314
315    public void setTheme(String theme) {
316        this.theme = theme;
317    }
318
319    @Merge("b")
320    @XmlAttribute(name = "uiOptions", namespace = ManifestNamespaceMapper.ANDROID_URI)
321    @XmlJavaTypeAdapter(LabeledConverter.UIOptionsConverter.class)
322    public UIOptions getUiOptions() {
323        return uiOptions;
324    }
325
326    public void setUiOptions(UIOptions uiOptions) {
327        this.uiOptions = uiOptions;
328    }
329
330    @Merge("w")
331    @XmlAttribute(name = "windowSoftInputMode", namespace = ManifestNamespaceMapper.ANDROID_URI)
332    @XmlJavaTypeAdapter(LabeledConverter.WindowSoftInputModeConverter.class)
333    public WindowSoftInputMode getWindowSoftInputMode() {
334        return windowSoftInputMode;
335    }
336
337    public void setWindowSoftInputMode(WindowSoftInputMode windowSoftInputMode) {
338        this.windowSoftInputMode = windowSoftInputMode;
339    }
340
341    @MergeCollection(collectionType = ArrayList.class, type = IntentFilter.class)
342    @XmlElement(name = "intent-filter")
343    public List<IntentFilter> getIntentFilters() {
344        return intentFilters;
345    }
346
347    public void setIntentFilters(List<IntentFilter> intentFilters) {
348        this.intentFilters = intentFilters;
349    }
350
351    @MergeCollection(collectionType = ArrayList.class, type = MetaData.class)
352    @XmlElement(name = "meta-data")
353    public List<MetaData> getMetaData() {
354        return metaData;
355    }
356
357    public void setMetaData(List<MetaData> metaData) {
358        this.metaData = metaData;
359    }
360
361    @Override
362    public boolean equals(Object obj) {
363        if (!(obj instanceof Activity)) {
364            return false;
365        }
366        if (this == obj) {
367            return true;
368        }
369        Activity rhs = (Activity) obj;
370        return new EqualsBuilder()
371                .append(name, rhs.name)
372                .isEquals();
373    }
374
375    @Override
376    public int hashCode() {
377        return name.hashCode();
378    }
379
380    @Override
381    @XmlTransient
382    public String getIdentifier() {
383        return name;
384    }
385
386    @Override
387    public int compareTo(Activity activity) {
388        return getName().compareTo(activity.getName());
389    }
390
391    public void updatePackage(String manifestPackage){
392        if(name != null && name.startsWith(manifestPackage) && containsTag("n")){
393            name = name.substring(manifestPackage.length());
394        }
395    }
396}