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}