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.experiment.generators; 017 018import org.androidtransfuse.adapter.ASTType; 019import org.androidtransfuse.analysis.IntentFilterFactory; 020import org.androidtransfuse.analysis.MetaDataBuilder; 021import org.androidtransfuse.annotations.*; 022import org.androidtransfuse.experiment.ComponentBuilder; 023import org.androidtransfuse.experiment.ComponentDescriptor; 024import org.androidtransfuse.experiment.ComponentPartGenerator; 025import org.androidtransfuse.experiment.Generation; 026import org.androidtransfuse.processor.ManifestManager; 027import org.apache.commons.lang.StringUtils; 028 029import javax.inject.Inject; 030import javax.inject.Provider; 031 032import static org.androidtransfuse.util.AnnotationUtil.checkBlank; 033import static org.androidtransfuse.util.AnnotationUtil.checkDefault; 034 035/** 036 * @author John Ericksen 037 */ 038public class ActivityManifestEntryGenerator implements Generation { 039 040 private final IntentFilterFactory intentFilterBuilder; 041 private final MetaDataBuilder metadataBuilder; 042 private final ManifestManager manifestManager; 043 private final Provider<org.androidtransfuse.model.manifest.Activity> manifestActivityProvider; 044 045 @Inject 046 public ActivityManifestEntryGenerator(IntentFilterFactory intentFilterBuilder, 047 MetaDataBuilder metadataBuilder, 048 ManifestManager manifestManager, 049 Provider<org.androidtransfuse.model.manifest.Activity> manifestActivityProvider) { 050 this.intentFilterBuilder = intentFilterBuilder; 051 this.metadataBuilder = metadataBuilder; 052 this.manifestManager = manifestManager; 053 this.manifestActivityProvider = manifestActivityProvider; 054 } 055 056 @Override 057 public void schedule(ComponentBuilder builder, ComponentDescriptor descriptor) { 058 059 if(descriptor.getTarget() != null && descriptor.getTarget().isAnnotated(Activity.class)) { 060 builder.add(new ComponentPartGenerator() { 061 public void generate(ComponentDescriptor descriptor) { 062 Activity activityAnnotation = descriptor.getTarget().getAnnotation(Activity.class); 063 ASTType type = descriptor.getTarget(); 064 065 org.androidtransfuse.model.manifest.Activity manifestActivity = buildManifestEntry(descriptor.getPackageClass().getFullyQualifiedName(), activityAnnotation); 066 067 manifestActivity.setIntentFilters(intentFilterBuilder.buildIntentFilters(type)); 068 manifestActivity.setMetaData(metadataBuilder.buildMetaData(type)); 069 070 manifestManager.addActivity(manifestActivity); 071 } 072 }); 073 } 074 } 075 076 protected org.androidtransfuse.model.manifest.Activity buildManifestEntry(String name, Activity activityAnnotation) { 077 org.androidtransfuse.model.manifest.Activity manifestActivity = manifestActivityProvider.get(); 078 079 manifestActivity.setName(name); 080 manifestActivity.setLabel(checkBlank(activityAnnotation.label())); 081 manifestActivity.setAllowTaskReparenting(checkDefault(activityAnnotation.allowTaskReparenting(), false)); 082 manifestActivity.setAlwaysRetainTaskState(checkDefault(activityAnnotation.alwaysRetainTaskState(), false)); 083 manifestActivity.setClearTaskOnLaunch(checkDefault(activityAnnotation.clearTaskOnLaunch(), false)); 084 manifestActivity.setConfigChanges(concatenate(activityAnnotation.configChanges())); 085 manifestActivity.setEnabled(checkDefault(activityAnnotation.enabled(), true)); 086 manifestActivity.setExcludeFromRecents(checkDefault(activityAnnotation.excludeFromRecents(), false)); 087 manifestActivity.setExported(activityAnnotation.exported().getValue()); 088 manifestActivity.setFinishOnTaskLaunch(checkDefault(activityAnnotation.finishOnTaskLaunch(), false)); 089 manifestActivity.setHardwareAccelerated(checkDefault(activityAnnotation.hardwareAccelerated(), false)); 090 manifestActivity.setIcon(checkBlank(activityAnnotation.icon())); 091 manifestActivity.setLaunchMode(checkDefault(activityAnnotation.launchMode(), LaunchMode.STANDARD)); 092 manifestActivity.setMultiprocess(checkDefault(activityAnnotation.multiprocess(), false)); 093 manifestActivity.setNoHistory(checkDefault(activityAnnotation.noHistory(), false)); 094 manifestActivity.setPermission(checkBlank(activityAnnotation.permission())); 095 manifestActivity.setProcess(checkBlank(activityAnnotation.process())); 096 manifestActivity.setScreenOrientation(checkDefault(activityAnnotation.screenOrientation(), ScreenOrientation.UNSPECIFIED)); 097 manifestActivity.setStateNotNeeded(checkDefault(activityAnnotation.stateNotNeeded(), false)); 098 manifestActivity.setTaskAffinity(checkBlank(activityAnnotation.taskAffinity())); 099 manifestActivity.setTheme(checkBlank(activityAnnotation.theme())); 100 manifestActivity.setUiOptions(checkDefault(activityAnnotation.uiOptions(), UIOptions.NONE)); 101 manifestActivity.setWindowSoftInputMode(checkDefault(activityAnnotation.windowSoftInputMode(), WindowSoftInputMode.STATE_UNSPECIFIED)); 102 103 return manifestActivity; 104 } 105 106 private String concatenate(ConfigChanges[] configChanges) { 107 if (configChanges.length == 0) { 108 return null; 109 } 110 111 return StringUtils.join(configChanges, "|"); 112 } 113}