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}