blob: 3e8c8f6caeac3ebed1c0fef16397b2fd9258bc56 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.motorola.studio.android.model;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.regex.Matcher;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.datatools.modelbase.sql.tables.Column;
import org.eclipse.datatools.modelbase.sql.tables.Table;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.formatter.CodeFormatter;
import org.eclipse.jdt.internal.core.DocumentAdapter;
import org.eclipse.jdt.internal.corext.util.CodeFormatterUtil;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.sequoyah.localization.tools.datamodel.node.StringArrayNode;
import org.eclipse.sequoyah.localization.tools.datamodel.node.StringNode;
import org.eclipse.text.edits.TextEdit;
import org.osgi.framework.Bundle;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.motorola.studio.android.codeutils.CodeUtilsActivator;
import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS;
import com.motorola.studio.android.common.IAndroidConstants;
import com.motorola.studio.android.common.exception.AndroidException;
import com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.common.log.UsageDataConstants;
import com.motorola.studio.android.common.utilities.EclipseUtils;
import com.motorola.studio.android.manifest.AndroidProjectManifestFile;
import com.motorola.studio.android.model.manifest.AndroidManifestFile;
import com.motorola.studio.android.model.manifest.dom.ActionNode;
import com.motorola.studio.android.model.manifest.dom.ActivityNode;
import com.motorola.studio.android.model.manifest.dom.ApplicationNode;
import com.motorola.studio.android.model.manifest.dom.CategoryNode;
import com.motorola.studio.android.model.manifest.dom.IntentFilterNode;
import com.motorola.studio.android.model.manifest.dom.ManifestNode;
import com.motorola.studio.android.model.manifest.dom.UsesPermissionNode;
import com.motorola.studio.android.model.resources.ResourceFile;
import com.motorola.studio.android.model.resources.types.AbstractResourceNode.NodeType;
import com.motorola.studio.android.model.resources.types.ResourcesNode;
import com.motorola.studio.android.resources.AndroidProjectResources;
/**
* Activity Controller Model.
* As part of a MVC architecture, this class should communicate with the Wizard UI
* to provide all needed information to create a functional Activity.
*/
@SuppressWarnings("restriction")
public class ActivityBasedOnTemplate extends Launcher
{
private static final String NEW_LINE = "\n";
public static String DATABASE_LIST_SAMPLE_LOCALIZED = ""; //$NON-NLS-1$
public static String LIST_ACTIVITIES_SAMPLE_LOCALIZED = ""; //$NON-NLS-1$
private static final String INTENT_ACTION_MAIN_NAME = "android.intent.action.MAIN"; //$NON-NLS-1$
private static final String INTENT_CATEGORY_LAUNCHER_NAME = "android.intent.category.LAUNCHER"; //$NON-NLS-1$
private static final String ACTIVITY_RESOURCE_LABEL_SUFFIX = "ActivityLabel"; //$NON-NLS-1$
private static final int MANIFEST_UPDATING_STEPS = 6;
private static final int RESOURCES_UPDATING_STEPS = 3;
public static final String ACTIVITY_SAMPLES_FOLDER = "templates/activity_samples"; //$NON-NLS-1$
private static final String SAMPLES_CONFIG_FILE_NAME = "samples_config.xml"; //$NON-NLS-1$
private static final String LIST_ACTIVITIES_CONFIG_FILE_NAME = "list_activities_config.xml"; //$NON-NLS-1$
private static final String STRINGS_FILE = "strings.xml"; //$NON-NLS-1$
public static final String PREVIEW_FILE_NAME = "preview.png"; //$NON-NLS-1$
public static final String NINE_PATCH_QUALIFIER = ".9";
private static final String RES_TYPE_LAYOUT = "layout"; //$NON-NLS-1$
private static final String RES_TYPE_DRAWABLE = "drawable"; //$NON-NLS-1$
private static final String RES_TYPE_ANIM = "anim"; //$NON-NLS-1$
private static final String RES_TYPE_SOURCE = "src"; //$NON-NLS-1$
private static final String RES_TYPE_VALUES = "values"; //$NON-NLS-1$
private static final String RES_TYPE_MENU = "menu"; //$NON-NLS-1$
private static final String RES_TYPE_XML = "xml"; //$NON-NLS-1$
private static final String DESCRIPTION_TAG = "description"; //$NON-NLS-1$
private static final String PREVIEW_TAG = "preview"; //$NON-NLS-1$
private static final String RESOURCE_TYPE_TAG = "resourceType"; //$NON-NLS-1$
private static final String MODIFIER_TAG = "modifier"; //$NON-NLS-1$
private static final String FILE_TAG = "file"; //$NON-NLS-1$
private static final String NAME_TAG = "name"; //$NON-NLS-1$
private static final String FINAL_NAME_TAG = "finalName"; //$NON-NLS-1$
private static final String SAMPLE_TAG = "sample"; //$NON-NLS-1$
private static final String DRAWABLE_REPLACE_TAG = "#drawable_name#"; //$NON-NLS-1$
private static final String ANIM_REPLACE_TAG = "#anim_name#"; //$NON-NLS-1$
private static final String LAYOUT_REPLACE_TAG = "#layout_name#"; //$NON-NLS-1$
private static final String PACKAGE_REPLACE_TAG = "#package_name#"; //$NON-NLS-1$
private static final String CLASS_REPLACE_TAG = "#class_name#"; //$NON-NLS-1$
private static final String MAIN_ACTIVITY_REPLACE_TAG = "#main_activity#"; //$NON-NLS-1$
private static final String XML_REPLACE_TAG = "#xml_name#"; //$NON-NLS-1$
private static final String MENU_REPLACE_TAG = "#menu_name#"; //$NON-NLS-1$
private static final String JAVA_EXTENSION = ".java"; //$NON-NLS-1$
public static final String DATABASE_LIST_SAMPLE = "Database List"; //$NON-NLS-1$
public static final String LIST_ACTIVITIES_SAMPLE = "List Activities"; //$NON-NLS-1$
public static final String TABS_SAMPLE = "Tabs"; //$NON-NLS-1$
public static enum SAMPLE_CATEGORY
{
SAMPLE_ACTIVITIES_CATEGORY, LIST_ACTIVITIES_CATEGORY
};
private boolean onStart = false;
private String sample = null;
private SAMPLE_CATEGORY sampleCategory = SAMPLE_CATEGORY.SAMPLE_ACTIVITIES_CATEGORY;
private boolean createOpenHelper = false;
private HashMap<String, HashMap<String, List<TemplateFile>>> availableSamples = null;
private HashMap<String, HashMap<String, List<TemplateFile>>> availableListSamples = null;
private final HashMap<String, String> samplesDescription = new HashMap<String, String>();
private final HashMap<String, String> samplesPreview = new HashMap<String, String>();
HashMap<String, String> workspaceResourceNames = null;
private List<StringNode> sampleStringNodes = null;
private List<StringArrayNode> sampleArrayNodes = null;
/*
* Boolean flag to tell if the Activity is based on the DatabaseList sample or not
*/
private boolean useSampleDatabaseColumnsSelected = false;
/*
* Boolean flag to tell if a table is selected if user has choose Database template
*/
private boolean isDatabaseTableSelected = false;
/*
* Boolean flag to tell if the Activity is based on the DatabaseList
* defines the SQL Open Helper (class name and package name)
*/
private boolean sqlOpenHelperDefined = false;
/*
* Boolean flag to tell if a list activity template is selected.
*/
private boolean isListActivitySelected = false;
private boolean isDatabaseTemplateSelected = false;
/*
* Collector interface specific to the DatabaseList sample
*/
private IDatabaseSampleActivityParametersWizardCollector collector = null;
/*
* Database name used by the collector
*/
private String collectorDatabaseName = null;
/*
* Database table used by the collector
*/
private Table collectorTable = null;
/*
* Database sqlOpenHelper class name used by the collector
*/
private String sqlOpenHelperClassName = null;
/*
* Database sqlOpenHelper package used by the collector
*/
private String sqlOpenHelperPackageName = null;
/*
* List of columns used by the collector
*/
private ArrayList<Column> collectorColumnList = new ArrayList<Column>();
/*
* Boolean flag to tell if the Activity will be set as MAIN or not in the AndroidManifest.
*/
private boolean isMainActivity = false;
/**
* Check if the onStart Method should be created
* @return
*/
public boolean isOnStart()
{
return onStart;
}
/**
* Change the onStart create property
* @param onStart
*/
public void setOnStart(boolean onStart)
{
this.onStart = onStart;
}
/**
* Constructor for the Activity.
*/
public ActivityBasedOnTemplate()
{
super(IAndroidConstants.CLASS_ACTIVITY);
DATABASE_LIST_SAMPLE_LOCALIZED =
ResourceBundle.getBundle("plugin").getString("Activity_Samples_DB_name"); //$NON-NLS-1$ //$NON-NLS-2$
LIST_ACTIVITIES_SAMPLE_LOCALIZED =
ResourceBundle
.getBundle("plugin").getString("Activity_Samples_ListActivities_name"); //$NON-NLS-1$ //$NON-NLS-2$
}
public void setSample(String sample)
{
this.sample = sample;
}
public void setSampleCategoty(SAMPLE_CATEGORY sampleCategory)
{
this.sampleCategory = sampleCategory;
}
public SAMPLE_CATEGORY getSampleCategoty()
{
return this.sampleCategory;
}
public String getSample()
{
return sample;
}
public boolean isBasicInformationFilledIn()
{
boolean needInfo = false;
IStatus status = getStatus();
if (status.getSeverity() > IStatus.WARNING)
{
needInfo = true;
}
return needInfo;
}
/**
* Enables finish button when page is filled.
*/
@Override
public boolean needMoreInformation()
{
boolean needInfo = isBasicInformationFilledIn();
if ((sample == null))
{
needInfo = true;
}
else if (sample.equals(ActivityBasedOnTemplate.DATABASE_LIST_SAMPLE_LOCALIZED))
{
if (useSampleDatabaseColumnsSelected && sqlOpenHelperDefined && isDatabaseTableSelected)
{
needInfo = false || needInfo;
}
else
{
needInfo = true;
}
}
else if (sample.equals(ActivityBasedOnTemplate.LIST_ACTIVITIES_SAMPLE_LOCALIZED))
{
if (isListActivitySelected)
{
needInfo = false || needInfo;
}
else
{
needInfo = true;
}
}
return needInfo;
}
/* (non-Javadoc)
* @see com.motorola.studio.android.model.IWizardModel#save(org.eclipse.jface.wizard.IWizardContainer, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public boolean save(IWizardContainer container, IProgressMonitor monitor)
throws AndroidException
{
boolean templateFiles = true;
String sourceFolder = null;
workspaceResourceNames = new HashMap<String, String>();
try
{
HashMap<String, List<TemplateFile>> selectedSample = null;
if (sampleCategory.equals(SAMPLE_CATEGORY.SAMPLE_ACTIVITIES_CATEGORY))
{
selectedSample = availableSamples.get(getSample());
}
else
{
selectedSample = availableListSamples.get(getSample());
}
Iterator<String> iterator = selectedSample.keySet().iterator();
// UDC log for activity samples use
StudioLogger.collectUsageData(
UsageDataConstants.WHAT_SAMPLE_ACTIVITY_CREATED, //$NON-NLS-1$
UsageDataConstants.KIND_SAMPLE_ACTIVITY_CREATED,
"Activity using sample " + getSample(), //$NON-NLS-1$
CodeUtilsActivator.PLUGIN_ID, CodeUtilsActivator.getDefault().getBundle()
.getVersion().toString());
/*
* Copy resources that have no references to other types
*/
while (iterator.hasNext() && templateFiles)
{
String resourceType = iterator.next();
/*
* First of all copy animation files, since they have no references so far
*/
if (resourceType.equals(RES_TYPE_ANIM))
{
//handle animation files
List<TemplateFile> filesList = selectedSample.get(resourceType);
sourceFolder = getAnimFolder(null);
for (int i = 0; i < filesList.size(); i++)
{
TemplateFile templateFile = filesList.get(i);
templateFiles =
templateFiles
& copyTemplateFile(templateFile.getModelName(),
templateFile.getFinalName(), sourceFolder,
ANIM_REPLACE_TAG, false, monitor);
}
}
else if (resourceType.equals(RES_TYPE_DRAWABLE))
{
List<TemplateFile> filesList = selectedSample.get(resourceType);
for (int i = 0; i < filesList.size(); i++)
{
TemplateFile templateFile = filesList.get(i);
sourceFolder = getDrawableFolder(templateFile.getModifier());
templateFiles =
templateFiles
& copyTemplateFile(templateFile.getModelName(),
templateFile.getFinalName(), sourceFolder,
DRAWABLE_REPLACE_TAG, templateFile.getFinalName()
.endsWith(".xml"), monitor);
}
}
else if (resourceType.equals(RES_TYPE_XML))
{
List<TemplateFile> filesList = selectedSample.get(resourceType);
for (int i = 0; i < filesList.size(); i++)
{
TemplateFile templateFile = filesList.get(i);
sourceFolder = getXmlFolder(templateFile.getModifier());
templateFiles =
templateFiles
& copyTemplateFile(templateFile.getModelName(),
templateFile.getFinalName(), sourceFolder,
XML_REPLACE_TAG, false, monitor);
}
}
else if (resourceType.equals(RES_TYPE_VALUES))
{
//treat sample string.xml
List<TemplateFile> filesList = selectedSample.get(resourceType);
for (int i = 0; i < filesList.size(); i++)
{
TemplateFile templateFile = filesList.get(i);
sourceFolder = getValuesFolder(templateFile.getModifier());
parseStringXmlNodes(templateFile.getModelName());
//add to string.xml
EclipseUtils.createOrUpdateDictionaryFile(getProject(),
getSampleStringNodes(), getSampleArrayNodes(), monitor);
}
}
else if (resourceType.equals(RES_TYPE_MENU))
{
//treat menu xml files
List<TemplateFile> filesList = selectedSample.get(resourceType);
sourceFolder = getMenuFolder(null);
for (int i = 0; i < filesList.size(); i++)
{
TemplateFile templateFile = filesList.get(i);
templateFiles =
templateFiles
& copyTemplateFile(templateFile.getModelName(),
templateFile.getFinalName(), sourceFolder,
MENU_REPLACE_TAG, false, monitor);
}
}
}
/*
* Copy layout files and replace references
*/
List<TemplateFile> filesList = selectedSample.get(RES_TYPE_LAYOUT);
if (filesList != null)
{
for (int i = 0; i < filesList.size(); i++)
{
TemplateFile templateFile = filesList.get(i);
sourceFolder = getLayoutFolder(templateFile.getModifier());
templateFiles =
templateFiles
& copyTemplateFile(templateFile.getModelName(),
templateFile.getFinalName(), sourceFolder,
LAYOUT_REPLACE_TAG, true, monitor);
}
}
}
catch (Exception e)
{
throw new AndroidException(e);
}
boolean classCreated = false;
if (templateFiles)
{
classCreated = createActivityClass(monitor);
}
boolean addedOnManifest = false;
if (classCreated)
{
addedOnManifest = createActivityOnManifest(monitor);
}
// Logs all permissions used in UDC log
super.save(container, monitor);
try
{
ResourcesPlugin.getWorkspace().getRoot()
.refreshLocal(IResource.DEPTH_INFINITE, monitor);
}
catch (CoreException e)
{
// do nothing
}
return classCreated && addedOnManifest && templateFiles;
}
private String getValuesFolder(String modifier)
{
return IAndroidConstants.FD_RES + IPath.SEPARATOR + IAndroidConstants.FD_VALUES
+ ((modifier != null) ? "-" + modifier : "");
}
private String getXmlFolder(String modifier)
{
return IAndroidConstants.FD_RES + IPath.SEPARATOR + IAndroidConstants.FD_XML
+ ((modifier != null) ? "-" + modifier : "");
}
private String getDrawableFolder(String modifier)
{
return IAndroidConstants.FD_RES + IPath.SEPARATOR + IAndroidConstants.FD_DRAWABLE
+ ((modifier != null) ? "-" + modifier : "");
}
private String getAnimFolder(String modifier)
{
return IAndroidConstants.FD_RES + IPath.SEPARATOR + IAndroidConstants.FD_ANIM;
}
private String getLayoutFolder(String modifier)
{
return IAndroidConstants.FD_RES + IPath.SEPARATOR + IAndroidConstants.FD_LAYOUT
+ ((modifier != null) ? "-" + modifier : "");
}
private String getMenuFolder(String modifier)
{
return IAndroidConstants.FD_RES + IPath.SEPARATOR + IAndroidConstants.FD_MENU
+ ((modifier != null) ? "-" + modifier : "");
}
public List<StringNode> getSampleStringNodes()
{
if (sampleStringNodes == null)
{
sampleStringNodes = new ArrayList<StringNode>();
}
return sampleStringNodes;
}
private void setSampleStringNodes(List<StringNode> sampleStringNodes)
{
this.sampleStringNodes = sampleStringNodes;
}
public List<StringArrayNode> getSampleArrayNodes()
{
if (sampleArrayNodes == null)
{
sampleArrayNodes = new ArrayList<StringArrayNode>();
}
return sampleArrayNodes;
}
private void setSampleArrayNodes(List<StringArrayNode> sampleArrayNodes)
{
this.sampleArrayNodes = sampleArrayNodes;
}
private void parseStringXmlNodes(String sampleStringFileName)
{
List<StringArrayNode> newArrayList = new ArrayList<StringArrayNode>();
List<StringNode> newStrList = new ArrayList<StringNode>();
try
{
File sampleStringXmlFile =
new File(FileLocator.toFileURL(
CodeUtilsActivator
.getDefault()
.getBundle()
.getEntry(
ACTIVITY_SAMPLES_FOLDER + IPath.SEPARATOR
+ sampleStringFileName)).getFile());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(sampleStringXmlFile);
doc.getDocumentElement().normalize();
//string nodes elements
NodeList nodeLst = doc.getElementsByTagName("string"); //$NON-NLS-1$
for (int s = 0; s < nodeLst.getLength(); s++)
{
Node fstNode = nodeLst.item(s);
if (fstNode.getNodeType() == Node.ELEMENT_NODE)
{
Element fstElmnt = (Element) fstNode;
String nameAtr = fstElmnt.getAttribute("name"); //$NON-NLS-1$
String stringValue = fstElmnt.getTextContent();
if ((nameAtr != null) && (nameAtr.length() > 0))
{
newStrList.add(new StringNode(nameAtr, stringValue));
}
}
}
//array nodes elements
nodeLst = doc.getElementsByTagName("string-array"); //$NON-NLS-1$
for (int s = 0; s < nodeLst.getLength(); s++)
{
Node fstNode = nodeLst.item(s);
if (fstNode.getNodeType() == Node.ELEMENT_NODE)
{
Element fstElmnt = (Element) fstNode;
String nameAtr = fstElmnt.getAttribute("name"); //$NON-NLS-1$
StringArrayNode strArray = new StringArrayNode(nameAtr);
NodeList arrayItems = fstElmnt.getChildNodes();
for (int i = 0; i < arrayItems.getLength(); i++)
{
Node itemNode = arrayItems.item(i);
if (itemNode.getNodeType() == Node.ELEMENT_NODE)
{
Element itemElmnt = (Element) itemNode;
String itemValue = itemElmnt.getTextContent();
strArray.addValue(itemValue);
}
}
newArrayList.add(strArray);
}
}
setSampleStringNodes(newStrList);
setSampleArrayNodes(newArrayList);
}
catch (Exception e)
{
StudioLogger.error(ActivityBasedOnTemplate.class, e.getMessage() + " " //$NON-NLS-1$
+ CodeUtilsNLS.UI_SampleSelectionPage_ErrorParsingStringXml, e);
}
return;
}
/*
* @param modelFilename Where file is going to be copied from
* @param finalFilename Final name for resource, if any
* @param sourceFolder Where file is going to be copied to
* @param monitor Progress monitor
* @param replacementTag tag do be replaced in the class file
* @return
* @throws Exception
*/
private boolean copyTemplateFile(String modelFilename, String finalFilename,
String sourceFolder, String replacementTag, boolean replaceReferences,
IProgressMonitor monitor) throws Exception
{
IFolder pkgFolder = getProject().getFolder(sourceFolder);
if (!pkgFolder.exists())
{
pkgFolder.create(true, true, monitor);
}
IFile destFile = null;
int i = 0;
String[] resourceNameAndExtension = getResourceNameAndExtension(finalFilename);
String resourceName = resourceNameAndExtension[0];
String extension = resourceNameAndExtension[1];
resourceName = filterResourceName(resourceName);
//ensures file to be copied still does not exist
do
{
if (i == 0)
{
destFile = pkgFolder.getFile(resourceName + extension);
}
else
{
destFile = pkgFolder.getFile(resourceName + i + extension);
}
i++;
}
while (destFile.exists());
if (i != 1)
{
resourceName = resourceName + --i;
}
//updates tags to be replaced at class file
String literalFileName = Matcher.quoteReplacement(modelFilename);
workspaceResourceNames.put(replacementTag + literalFileName + "#", resourceName); //$NON-NLS-1$
monitor.beginTask(
CodeUtilsNLS.UI_ActivityBasedOnTemplateSupport_Configuring_Sample_Source_Task, 150);
InputStream is = null;
try
{
//gets template stream and creates a copy at user workspace
if (!replaceReferences)
{
Bundle bundle = CodeUtilsActivator.getDefault().getBundle();
URL url = bundle.getEntry((new StringBuilder("/")).append( //$NON-NLS-1$
ACTIVITY_SAMPLES_FOLDER + IPath.SEPARATOR + modelFilename).toString());
is = url.openStream();
}
else
{
// Get the original file as a string
String fileString =
EclipseUtils.readEmbeddedResource(CodeUtilsActivator.getDefault()
.getBundle(), ACTIVITY_SAMPLES_FOLDER + IPath.SEPARATOR
+ modelFilename);
fileString = replaceResourceNames(fileString);
is = new ByteArrayInputStream(fileString.getBytes("UTF-8"));
}
destFile.create(is, IResource.NONE, new SubProgressMonitor(monitor, 100));
}
finally
{
if (is != null)
{
is.close();
}
monitor.done();
}
return true;
}
private String[] getResourceNameAndExtension(String fullName)
{
String[] result = new String[2];
String resourceName = fullName.substring(fullName.lastIndexOf("/") + 1, //$NON-NLS-1$
fullName.lastIndexOf(".")); //$NON-NLS-1$
String extension = fullName.substring(fullName.lastIndexOf(".")); //$NON-NLS-1$
//detect 9-patch files
if (extension.equals(".png") && resourceName.endsWith(NINE_PATCH_QUALIFIER))
{
resourceName =
resourceName
.substring(0, resourceName.length() - NINE_PATCH_QUALIFIER.length());
extension = NINE_PATCH_QUALIFIER + extension;
}
result[0] = resourceName;
result[1] = extension;
return result;
}
/*
* Creates the Activity java class
*
* @param monitor the progress monitor
*
* @return true if the class has been created or false otherwise
* @throws AndroidException
*/
private boolean createActivityClass(IProgressMonitor monitor) throws AndroidException
{
boolean created = false;
monitor.subTask(CodeUtilsNLS.UI_Activity_CreatingTheActivityJavaClass);
String[] samplePath = null;
try
{
samplePath = getSamplePath(RES_TYPE_SOURCE);
createJavaClassFileFromTemplate(samplePath, monitor);
created = true;
}
catch (JavaModelException e)
{
String errMsg =
NLS.bind(CodeUtilsNLS.EXC_Activity_CannotCreateTheActivityClass, getName(),
e.getLocalizedMessage());
throw new AndroidException(errMsg);
}
catch (AndroidException e)
{
String errMsg =
NLS.bind(CodeUtilsNLS.EXC_Activity_CannotCreateTheActivityClass, getName(),
e.getLocalizedMessage());
throw new AndroidException(errMsg);
}
return created;
}
/**
* Package name (based on project name declared on manifest)
* @param project
* @return
* @throws CoreException Exception thrown in case there are problems handling the android project
* @throws AndroidException Exception thrown in case there are problems handling the android project
*/
protected String getManifestPackageName(IProject project) throws AndroidException,
CoreException
{
// get android application name
AndroidManifestFile androidManifestFile =
AndroidProjectManifestFile.getFromProject(project);
String appNamespace = ""; //$NON-NLS-1$
if (androidManifestFile != null)
{
ManifestNode manifestNode = androidManifestFile.getManifestNode();
appNamespace = manifestNode.getPackageName();
}
// return the android application name along with a persistence constant
return appNamespace;
}
/**
* Creates the Java Class file based on text template file
*
* @param sourcePath The path to the file
* @param monitor The progress monitor
* @throws JavaModelException
* @throws AndroidException
*/
@SuppressWarnings(
{
"rawtypes", "unchecked"
})
protected void createJavaClassFileFromTemplate(String[] sourcePath, IProgressMonitor monitor)
throws JavaModelException, AndroidException
{
//only one class supported
for (int i = 0; i < sourcePath.length; i++)
{
String loadedTemplate =
EclipseUtils.readEmbeddedResource(CodeUtilsActivator.getDefault().getBundle(),
sourcePath[i]);
String packageName = getPackageFragment().getElementName();
loadedTemplate = loadedTemplate.replaceAll(CLASS_REPLACE_TAG, getName());
loadedTemplate = loadedTemplate.replaceAll(PACKAGE_REPLACE_TAG, packageName);
loadedTemplate =
loadedTemplate.replaceAll("#FILL_PARENT_LPARAM#", getApiVersion() > 7
? "MATCH_PARENT" : "FILL_PARENT");
try
{
loadedTemplate = loadedTemplate.replaceAll("#ManifestPackageName#", //$NON-NLS-1$
getManifestPackageName(getProject()));
}
catch (CoreException e)
{
throw new AndroidException("Failed to get manifest file to add import from R", e); //$NON-NLS-1$
}
if ((sample != null)
&& sample.equals(ActivityBasedOnTemplate.DATABASE_LIST_SAMPLE_LOCALIZED))
{
collector = getDatabaseSampleActivityParametersWizardCollector();
if (collector != null)
{
collector.setDatabaseName(this.collectorDatabaseName);
collector.setTable(this.collectorTable);
collector.setSelectedColumns(collectorColumnList);
collector.setSqlOpenHelperClassName(getSqlOpenHelperClassName());
collector.setSqlOpenHelperPackageName(getSqlOpenHelperPackageName());
collector.setCreateOpenHelper(isCreateOpenHelper());
//using Database list sample - it is an special case because it get data from an specific .db table
loadedTemplate =
loadedTemplate.replaceAll("#dbName#", collector.getDatabaseName()); //$NON-NLS-1$
loadedTemplate =
loadedTemplate.replaceAll("#tableName#", collector.getTableName()); //$NON-NLS-1$
loadedTemplate =
loadedTemplate.replaceAll(
"#tableNameUpperCase#", collector.getTableName() //$NON-NLS-1$
.toUpperCase());
loadedTemplate =
loadedTemplate.replaceAll(
"#tableNameLowerCase#", collector.getTableName() //$NON-NLS-1$
.toLowerCase());
loadedTemplate =
loadedTemplate.replaceAll("#columsNames#", collector.getColumnsNames()); //$NON-NLS-1$
loadedTemplate = loadedTemplate.replaceAll("#constColumnsNames#", //$NON-NLS-1$
collector.getConstColumnsNames());
loadedTemplate =
loadedTemplate.replaceAll(
"#columnGetValues#", collector.getCursorValues()); //$NON-NLS-1$
loadedTemplate =
loadedTemplate.replaceAll(
"#columnAddRows#", collector.getAddColumnsToRow()); //$NON-NLS-1$
loadedTemplate = loadedTemplate.replaceAll("#sqlOpenHelperName#", //$NON-NLS-1$
getSqlOpenHelperClassName());
loadedTemplate = loadedTemplate.replaceAll("#imports#", collector.getImports()); //$NON-NLS-1$
loadedTemplate = loadedTemplate.replaceAll("#getReadableDatabase#", //$NON-NLS-1$
collector.getReadableDatabase());
if (isCreateOpenHelper())
{
collector.createSqlOpenHelper(getProject(), monitor);
}
}
}
//replace the main activity of the project, first used by action_bar template
try
{
//assume mainActivity be the activity we are creating (if the project has no main activity). Try to find the real main activity if the isMainActivity flag is false.
String mainActivityName = getName();
if (!isMainActivity)
{
ActivityNode mainActivityNode =
AndroidProjectManifestFile.getFromProject(getProject())
.getMainActivity();
if (mainActivityNode != null)
{
mainActivityName = mainActivityNode.getNodeProperties().get("android:name");
//remove a possible '.' that activities may contain before the name
if ((mainActivityName.length() > 0) && (mainActivityName.charAt(0) == '.'))
{
mainActivityName =
mainActivityName.substring(1, mainActivityName.length());
}
}
}
loadedTemplate =
loadedTemplate.replaceAll(MAIN_ACTIVITY_REPLACE_TAG, mainActivityName);
}
catch (CoreException e)
{
StudioLogger.error("Could not get Android Manifest File from project.");
}
loadedTemplate = replaceResourceNames(loadedTemplate);
IPackageFragment targetPackage =
getPackageFragmentRoot().getPackageFragment(
getPackageFragment().getElementName());
if (!targetPackage.exists())
{
getPackageFragmentRoot().createPackageFragment(targetPackage.getElementName(),
true, monitor);
}
/*
* Create activity class. Only the first src resource will become the Activity subclass.
* The other classes will be copied AS IS
*/
String resourceName =
i == 0 ? getName() + JAVA_EXTENSION : Path.fromPortableString(sourcePath[i])
.lastSegment();
ICompilationUnit cu =
targetPackage
.createCompilationUnit(resourceName, loadedTemplate, true, monitor);
//indent activity class
try
{
ICompilationUnit workingCopy = cu.getWorkingCopy(monitor);
IDocument document = new DocumentAdapter(workingCopy.getBuffer());
//get project indentation configuration
Map mapOptions = JavaCore.create(getProject()).getOptions(true);
//changes to be applyed to the document
TextEdit textEdit =
CodeFormatterUtil.format2(CodeFormatter.K_COMPILATION_UNIT
| CodeFormatter.F_INCLUDE_COMMENTS, document.get(), 0,
System.getProperty("line.separator"), mapOptions); //$NON-NLS-1$
workingCopy.applyTextEdit(textEdit, monitor);
workingCopy.reconcile(ICompilationUnit.NO_AST, false, null, null);
workingCopy.commitWorkingCopy(true, monitor);
workingCopy.discardWorkingCopy();
}
catch (Exception ex)
{
//do nothing - indentation fails
}
}
}
private String replaceResourceNames(String textFile)
{
for (String curTag : workspaceResourceNames.keySet())
{
textFile = textFile.replaceAll(curTag, workspaceResourceNames.get(curTag));
}
return textFile;
}
public boolean isCreateOpenHelper()
{
return createOpenHelper;
}
public void setCreateOpenHelper(boolean createOpenHelper)
{
this.createOpenHelper = createOpenHelper;
}
/*
* Creates the Activity class entry on AndroidManifest.xml file
*
* @param monitor the progress monitor
*
* @return true if the entry has been added or false otherwise
* @throws AndroidException
*/
private boolean createActivityOnManifest(IProgressMonitor monitor) throws AndroidException
{
boolean created = false;
try
{
int totalWork = MANIFEST_UPDATING_STEPS + RESOURCES_UPDATING_STEPS;
monitor.beginTask("", totalWork); //$NON-NLS-1$
monitor.subTask(CodeUtilsNLS.UI_Common_UpdatingTheAndroidManifestXMLFile);
AndroidManifestFile androidManifestFile =
AndroidProjectManifestFile.getFromProject(getProject());
monitor.worked(1);
ManifestNode manifestNode =
androidManifestFile != null ? androidManifestFile.getManifestNode() : null;
ApplicationNode applicationNode =
manifestNode != null ? manifestNode.getApplicationNode() : null;
monitor.worked(1);
if (applicationNode != null)
{
// Adds the added permission nodes to manifest file
List<String> permissionsNames = new ArrayList<String>();
for (UsesPermissionNode i : manifestNode.getUsesPermissionNodes())
{
if (!permissionsNames.contains(i.getName()))
{
permissionsNames.add(i.getName());
}
}
for (String intentFilterPermission : getIntentFilterPermissionsAsArray())
{
if (!permissionsNames.contains(intentFilterPermission))
{
manifestNode.addChild(new UsesPermissionNode(intentFilterPermission));
}
}
boolean activityExists = false;
// Existing activity, if exists
ActivityNode existingActivity = null;
String classQualifier =
(getPackageFragment().getElementName()
.equals(manifestNode.getPackageName()) ? "" : getPackageFragment() //$NON-NLS-1$
.getElementName()) + "."; //$NON-NLS-1$
for (ActivityNode activityNode : applicationNode.getActivityNodes())
{
if (activityNode.getName()
.substring(activityNode.getName().lastIndexOf('.') + 1)
.equals(getName()))
{
activityExists = true;
existingActivity = activityNode;
break;
}
}
if (isMainActivity)
{
boolean actionRemoved = false;
//check if there is a main activity. If so, removes actions and intent filter
for (ActivityNode activityNode : applicationNode.getActivityNodes())
{
if ((existingActivity != null) && existingActivity.equals(activityNode))
{
continue;
}
List<IntentFilterNode> intentList = activityNode.getIntentFilterNodes();
for (IntentFilterNode currentIntent : intentList)
{
actionRemoved = false;
List<ActionNode> actionList = currentIntent.getActionNodes();
for (ActionNode currentAction : actionList)
{
if (currentAction.getName().equals(INTENT_ACTION_MAIN_NAME))
{
currentIntent.removeActionNode(currentAction);
actionRemoved = true;
}
}
//if INTENT_ACTION_MAIN_NAME is found remove INTENT_CATEGORY_LAUNCHER_NAME too
if (actionRemoved)
{
List<CategoryNode> categoryList = currentIntent.getCategoryNodes();
for (CategoryNode currentCategory : categoryList)
{
if (currentCategory.getName().equals(
INTENT_CATEGORY_LAUNCHER_NAME))
{
currentIntent.removeCategoryNode(currentCategory);
}
}
}
//remove intent filter if empty
if (actionRemoved && (currentIntent.getChildren().length == 0))
{
activityNode.removeIntentFilterNode(currentIntent);
}
}
}
}
monitor.worked(1);
if (!activityExists)
{
ActivityNode activityNode = new ActivityNode(classQualifier + getName());
String activityLabel = createActivityLabel(monitor);
if (activityLabel != null)
{
activityNode.setLabel(AndroidProjectResources.STRING_CALL_PREFIX
+ activityLabel);
}
IntentFilterNode intentFilterNode = new IntentFilterNode();
for (String intentFilterAction : getIntentFilterActionsAsArray())
{
intentFilterNode.addActionNode(new ActionNode(intentFilterAction));
}
for (String intentFilterCategory : getIntentFilterCategoriesAsArray())
{
intentFilterNode.addCategoryNode(new CategoryNode(intentFilterCategory));
}
// Check if we need to insert a filter action and filter category setting this activity as MAIN
if (isMainActivity)
{
intentFilterNode.addActionNode(new ActionNode(INTENT_ACTION_MAIN_NAME));
intentFilterNode.addCategoryNode(new CategoryNode(
INTENT_CATEGORY_LAUNCHER_NAME));
}
if (intentFilterNode.getChildren().length > 0)
{
activityNode.addIntentFilterNode(intentFilterNode);
}
applicationNode.addActivityNode(activityNode);
monitor.worked(1);
monitor.subTask(CodeUtilsNLS.UI_Common_SavingTheAndroidManifestXMLFile);
AndroidProjectManifestFile.saveToProject(getProject(), androidManifestFile,
true);
created = true;
monitor.worked(1);
}
else
{
if (isMainActivity)
{
boolean hasMainAction = false;
boolean hasLauncherCategory = false;
// Check if the existing activity already has the MAIN and LAUNCHER intents
if (existingActivity != null)
{
// Retrieve list of intent nodes
List<IntentFilterNode> intentFilterNodeList =
existingActivity.getIntentFilterNodes();
// Create a intent filter in case it does not exist
if (intentFilterNodeList.size() < 1)
{
IntentFilterNode intentNode = new IntentFilterNode();
intentFilterNodeList.add(intentNode);
existingActivity.addIntentFilterNode(intentNode);
}
for (IntentFilterNode intentFilterNode : intentFilterNodeList)
{
// Retrieve a list of intent actions
List<ActionNode> actionNodes = intentFilterNode.getActionNodes();
for (ActionNode actionNode : actionNodes)
{
if (actionNode.getName().equals(INTENT_ACTION_MAIN_NAME))
{
hasMainAction = true;
}
break;
}
// Retrieve a list of intent categories
List<CategoryNode> categoryNodes =
intentFilterNode.getCategoryNodes();
for (CategoryNode categoryNode : categoryNodes)
{
if (categoryNode.getName()
.equals(INTENT_CATEGORY_LAUNCHER_NAME))
{
hasLauncherCategory = true;
}
break;
}
// If both the action and launcher are missing, insert them and break the loop to avoid duplicates
if (!hasMainAction && !hasLauncherCategory)
{
intentFilterNode.addActionNode(new ActionNode(
INTENT_ACTION_MAIN_NAME));
intentFilterNode.addCategoryNode(new CategoryNode(
INTENT_CATEGORY_LAUNCHER_NAME));
break;
}
}
}
monitor.subTask(CodeUtilsNLS.UI_Common_SavingTheAndroidManifestXMLFile);
AndroidProjectManifestFile.saveToProject(getProject(), androidManifestFile,
true);
created = true;
monitor.worked(1);
}
else
{
created = true;
}
}
}
}
catch (AndroidException e)
{
String errMsg =
NLS.bind(CodeUtilsNLS.EXC_Activity_CannotUpdateTheManifestFile, getName(),
e.getLocalizedMessage());
throw new AndroidException(errMsg);
}
catch (CoreException e)
{
String errMsg =
NLS.bind(CodeUtilsNLS.EXC_Activity_CannotUpdateTheManifestFile, getName(),
e.getLocalizedMessage());
throw new AndroidException(errMsg);
}
finally
{
monitor.done();
}
return created;
}
/**
* Adds the Activity label value on the strings resource file
*
* @param monitor the progress monitor
*
* @return The label value if it has been added to the strings resource file or null otherwise
* @throws AndroidException
*/
protected String createActivityLabel(IProgressMonitor monitor) throws AndroidException
{
String resLabel = null;
if ((getLabel() != null) && (getLabel().trim().length() > 0))
{
try
{
monitor.subTask(CodeUtilsNLS.UI_Common_UpdatingTheStringsResourceFile);
ResourceFile stringsFile =
AndroidProjectResources.getResourceFile(getProject(), NodeType.String);
monitor.worked(1);
if (stringsFile.getResourcesNode() == null)
{
stringsFile.addResourceEntry(new ResourcesNode());
}
resLabel =
stringsFile.getNewResourceName(getName() + ACTIVITY_RESOURCE_LABEL_SUFFIX);
com.motorola.studio.android.model.resources.types.StringNode strNode =
new com.motorola.studio.android.model.resources.types.StringNode(resLabel);
strNode.setNodeValue(getLabel());
stringsFile.getResourcesNode().addChildNode(strNode);
monitor.worked(1);
AndroidProjectResources
.saveResourceFile(getProject(), stringsFile, NodeType.String);
monitor.worked(1);
}
catch (CoreException e)
{
String errMsg =
NLS.bind(CodeUtilsNLS.EXC_Activity_CannotCreateTheActivityLabel,
e.getLocalizedMessage());
throw new AndroidException(errMsg);
}
catch (AndroidException e)
{
String errMsg =
NLS.bind(CodeUtilsNLS.EXC_Activity_CannotCreateTheActivityLabel,
e.getLocalizedMessage());
throw new AndroidException(errMsg);
}
}
return resLabel;
}
/**
* Return the default onStart() method signature including return value and visibility level.
* @return
*/
public String getOnStartMessage()
{
return "protected void onStart()"; //$NON-NLS-1$
}
/**
* @return The selected sample's file.
*/
public String[] getSamplePath(String resourceType)
{
List<TemplateFile> resTypeFiles = null;
if (sampleCategory.equals(SAMPLE_CATEGORY.SAMPLE_ACTIVITIES_CATEGORY))
{
resTypeFiles = availableSamples.get(getSample()).get(resourceType);
}
else
{
resTypeFiles = availableListSamples.get(getSample()).get(resourceType);
}
String[] resTypePaths = new String[resTypeFiles.size()];
for (int i = 0; i < resTypeFiles.size(); i++)
{
resTypePaths[i] =
ACTIVITY_SAMPLES_FOLDER + IPath.SEPARATOR + resTypeFiles.get(i).getModelName();
}
return resTypePaths;
}
/**
* Evaluate available samples parsing samples_config.xml
* @return
*/
public void evaluateSamplesList(SAMPLE_CATEGORY category)
{
HashMap<String, HashMap<String, List<TemplateFile>>> currentMap = null;
try
{
String configFileName;
if (category.equals(SAMPLE_CATEGORY.SAMPLE_ACTIVITIES_CATEGORY))
{
configFileName = SAMPLES_CONFIG_FILE_NAME;
availableSamples = new HashMap<String, HashMap<String, List<TemplateFile>>>();
currentMap = availableSamples;
}
else if (category.equals(SAMPLE_CATEGORY.LIST_ACTIVITIES_CATEGORY))
{
configFileName = LIST_ACTIVITIES_CONFIG_FILE_NAME;
availableListSamples = new HashMap<String, HashMap<String, List<TemplateFile>>>();
currentMap = availableListSamples;
}
else
{
throw new Exception();
}
File configFile =
new File(FileLocator.toFileURL(
CodeUtilsActivator
.getDefault()
.getBundle()
.getEntry(
ACTIVITY_SAMPLES_FOLDER + IPath.SEPARATOR
+ configFileName)).getFile());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(configFile);
doc.getDocumentElement().normalize();
NodeList nodeLst = doc.getElementsByTagName(SAMPLE_TAG);
for (int s = 0; s < nodeLst.getLength(); s++)
{
HashMap<String, List<TemplateFile>> currentSample = null;
Node fstNode = nodeLst.item(s);
if (fstNode.getNodeType() == Node.ELEMENT_NODE)
{
Element fstElmnt = (Element) fstNode;
NodeList fstNmElmntLst = fstElmnt.getElementsByTagName(FILE_TAG);
String nameAtr = fstElmnt.getAttribute(NAME_TAG);
nameAtr =
Platform.getResourceString(CodeUtilsActivator.getDefault().getBundle(),
nameAtr.trim());
String descAtr = fstElmnt.getAttribute(DESCRIPTION_TAG);
descAtr =
Platform.getResourceString(CodeUtilsActivator.getDefault().getBundle(),
descAtr.trim());
String folderAtr = fstElmnt.getAttribute(PREVIEW_TAG);
if (folderAtr != null)
{
samplesPreview.put(nameAtr, folderAtr);
}
samplesDescription.put(nameAtr, descAtr);
currentSample = new HashMap<String, List<TemplateFile>>();
for (int n = 0; n < fstNmElmntLst.getLength(); n++)
{
Node fileNode = fstNmElmntLst.item(n);
Element fileElmnt = (Element) fileNode;
String resType = fileElmnt.getAttribute(RESOURCE_TYPE_TAG);
String resName = fileElmnt.getAttribute(NAME_TAG);
String finalName = fileElmnt.getAttribute(FINAL_NAME_TAG);
String modifier = fileElmnt.getAttribute(MODIFIER_TAG);
TemplateFile templateFile =
new TemplateFile(resType, resName, ((finalName.equals(""))
? resName : finalName), (((modifier.equals("")) ? null
: modifier)));
if ((resName != null) && (resName.lastIndexOf(".") > -1)) //$NON-NLS-1$
{
if (currentSample.get(resType) == null)
{
List<TemplateFile> curRes = new ArrayList<TemplateFile>();
curRes.add(templateFile);
currentSample.put(resType, curRes);
}
else
{
List<TemplateFile> curRes = currentSample.get(resType);
curRes.add(templateFile);
}
}
}
currentMap.put(nameAtr, currentSample);
}
}
}
catch (Exception e)
{
currentMap.clear();
StudioLogger.error(ActivityBasedOnTemplate.class,
CodeUtilsNLS.UI_GenerateSampleListError, e);
}
}
/**
* @return available samples
*/
public HashMap<String, HashMap<String, List<TemplateFile>>> getAvailableSamples()
{
return availableSamples;
}
/**
* Return available list activities samples.
* @return available list activities samples
*/
public HashMap<String, HashMap<String, List<TemplateFile>>> getListActivitiesSamples()
{
return availableListSamples;
}
public String getSamplePreview()
{
return samplesPreview.get(getSample());
}
/**
* Returns selected sample description
* @return sample description
*/
public String getSampleDescription()
{
StringBuffer result = new StringBuffer();
HashMap<String, List<TemplateFile>> selectedSample = null;
if (sampleCategory.equals(SAMPLE_CATEGORY.SAMPLE_ACTIVITIES_CATEGORY))
{
selectedSample = availableSamples.get(getSample());
}
else
{
selectedSample = availableListSamples.get(getSample());
}
if (selectedSample != null)
{
result.append(samplesDescription.get(getSample()));
result.append(NEW_LINE); //$NON-NLS-1$
if (selectedSample.size() > 0)
{
result.append(NEW_LINE); //$NON-NLS-1$
result.append(CodeUtilsNLS.UI_SampleSelectionPage_Description);
result.append(NEW_LINE); //$NON-NLS-1$
for (String resourceType : selectedSample.keySet())
{
result.append("\n - "); //$NON-NLS-1$
List<TemplateFile> filesList = selectedSample.get(resourceType);
if (resourceType.equals(RES_TYPE_SOURCE))
{
for (int i = 0; i < filesList.size(); i++)
{
if (i > 0)
{
result.append("\n - "); //$NON-NLS-1$
}
if (getPackageFragment() != null)
{
IResource packageResource = getPackageFragment().getResource();
IPath projectRelativePath =
packageResource.getProjectRelativePath();
String tmpName =
filesList
.get(i)
.getFinalName()
.substring(
filesList.get(i).getFinalName()
.indexOf("/") + 1); //$NON-NLS-1$
/*
* Resolve class name.
* Keeping backward compatibility, the first declared resource of type RES_TYPE_SOURCE will be considered as the class that will become the Activity
* So the other RES_TYPE_SOURCE resources names are kept unchanged
*/
if (i == 0)
{
String className = getName();
if ((className == null)
|| ((className != null) && (className.length() == 0)))
{
className = "<Activity>";
}
tmpName =
tmpName.replace(
tmpName.substring(0, tmpName.indexOf(".")), //$NON-NLS-1$
className);
}
result.append(projectRelativePath.toString() + IPath.SEPARATOR
+ tmpName);
result.append(" (" + getSampleResourceTypeFriendlyName(resourceType) //$NON-NLS-1$
+ ")"); //$NON-NLS-1$
}
}
}
else
{
for (int i = 0; i < filesList.size(); i++)
{
if (i > 0)
{
result.append("\n - "); //$NON-NLS-1$
}
// append folder
if (resourceType.equals(RES_TYPE_DRAWABLE))
{
result.append(getDrawableFolder(filesList.get(i).getModifier())
+ IPath.SEPARATOR);
}
else if (resourceType.equals(RES_TYPE_LAYOUT))
{
result.append(getLayoutFolder(filesList.get(i).getModifier())
+ IPath.SEPARATOR);
}
else if (resourceType.equals(RES_TYPE_VALUES))
{
result.append(getValuesFolder(filesList.get(i).getModifier())
+ IPath.SEPARATOR);
}
else if (resourceType.equals(RES_TYPE_ANIM))
{
result.append(getAnimFolder(filesList.get(i).getModifier())
+ IPath.SEPARATOR);
}
else if (resourceType.equals(RES_TYPE_XML))
{
result.append(getXmlFolder(filesList.get(i).getModifier())
+ IPath.SEPARATOR);
}
else if (resourceType.equals(RES_TYPE_MENU))
{
result.append(getMenuFolder(filesList.get(i).getModifier())
+ IPath.SEPARATOR);
}
// append file name
if (resourceType.equals(RES_TYPE_VALUES))
{
result.append(STRINGS_FILE);
}
else
{
String[] resourceNameAndExtension =
getResourceNameAndExtension(filesList.get(i).getFinalName());
String resourceName = resourceNameAndExtension[0];
String extension = resourceNameAndExtension[1];
result.append(filterResourceName(resourceName) + extension); //$NON-NLS-1$
}
result.append(" (" + getSampleResourceTypeFriendlyName(resourceType) //$NON-NLS-1$
+ ")"); //$NON-NLS-1$
}
}
}
}
}
return result.toString();
}
private String getSampleResourceTypeFriendlyName(String resourceType)
{
String result = null;
if (resourceType.equals(RES_TYPE_LAYOUT))
{
result = CodeUtilsNLS.UI_SampleSelectionPage_Description_LayoutFile;
}
else if (resourceType.equals(RES_TYPE_DRAWABLE))
{
result = CodeUtilsNLS.UI_SampleSelectionPage_Description_DrawableFile;
}
else if (resourceType.equals(RES_TYPE_SOURCE))
{
result = CodeUtilsNLS.UI_SampleSelectionPage_Description_JavaFile;
}
else if (resourceType.equals(RES_TYPE_VALUES))
{
result = CodeUtilsNLS.UI_SampleSelectionPage_Description_StringFile;
}
else if (resourceType.equals(RES_TYPE_XML))
{
result = CodeUtilsNLS.UI_SampleSelectionPage_Description_XMLFile;
}
else if (resourceType.equals(RES_TYPE_ANIM))
{
result = CodeUtilsNLS.UI_SampleSelectionPage_Description_AnimFile;
}
else if (resourceType.equals(RES_TYPE_MENU))
{
result = CodeUtilsNLS.UI_SampleSelectionPage_Description_MenuFile;
}
return result;
}
/*
* Filter file names to [a-z][1-9]
* @param name: string typed by the user
* @return filtered string
*/
private String filterResourceName(String name)
{
String resourceName = name.toLowerCase();
StringBuilder bld = new StringBuilder();
for (int i = 0; i < resourceName.length(); i++)
{
char temp = resourceName.charAt(i);
if (Character.isLetter(temp) || Character.isDigit(temp))
{
bld.append(temp);
}
}
return bld.toString();
}
/*
* Extension point related ids section
*/
private static final String PARAMETER_COLLECTOR_EXTENSION_POINT_ID =
CodeUtilsActivator.PLUGIN_ID + ".sampleActivityDatabase"; //$NON-NLS-1$
private static final String PARAMETER_COLLECTOR_ELEM = "parameterCollector"; //$NON-NLS-1$
private static final String IMPL_CLASS_ATTR = "class"; //$NON-NLS-1$
public IDatabaseSampleActivityParametersWizardCollector getDatabaseSampleActivityParametersWizardCollector()
{
IExtensionRegistry extReg = Platform.getExtensionRegistry();
IExtensionPoint extPoint = extReg.getExtensionPoint(PARAMETER_COLLECTOR_EXTENSION_POINT_ID);
IExtension[] extensions = extPoint.getExtensions();
IDatabaseSampleActivityParametersWizardCollector collector = null;
for (IExtension aExtension : extensions)
{
IConfigurationElement[] configElements = aExtension.getConfigurationElements();
for (IConfigurationElement aConfig : configElements)
{
if (aConfig.getName().equals(PARAMETER_COLLECTOR_ELEM))
{
try
{
collector =
(IDatabaseSampleActivityParametersWizardCollector) aConfig
.createExecutableExtension(IMPL_CLASS_ATTR);
break;
}
catch (CoreException e)
{
// Do nothing.
// If a device framework cannot be instantiated, it will
// not be plugged to emulator core plugin.
}
}
}
}
return collector;
}
public boolean isUseSampleDatabaseTableSelected()
{
return useSampleDatabaseColumnsSelected;
}
public void setUseSampleDatabaseTableSelected(boolean useSampleDatabaseTableSelected)
{
this.useSampleDatabaseColumnsSelected = useSampleDatabaseTableSelected;
}
public boolean isListActivitySelected()
{
return isListActivitySelected;
}
public void setIsListActivitySelected(boolean isListActivitySelected)
{
this.isListActivitySelected = isListActivitySelected;
}
/**
* @return the isDatabaseTemplateSelected
*/
public boolean isDatabaseTemplateSelected()
{
return isDatabaseTemplateSelected;
}
/**
* @param isDatabaseTemplateSelected the isDatabaseTemplateSelected to set
*/
public void setDatabaseTemplateSelected(boolean isDatabaseTemplateSelected)
{
this.isDatabaseTemplateSelected = isDatabaseTemplateSelected;
}
/**
* @return the isDatabaseTableSelected
*/
public boolean isDatabaseTableSelected()
{
return isDatabaseTableSelected;
}
/**
* @param isDatabaseTableSelected the isDatabaseTableSelected to set
*/
public void setDatabaseTableSelected(boolean isDatabaseTableSelected)
{
this.isDatabaseTableSelected = isDatabaseTableSelected;
}
/**
* @param collectorDatabaseName the collectorDatabaseName to set
*/
public void setCollectorDatabaseName(String collectorDatabaseName)
{
this.collectorDatabaseName = collectorDatabaseName;
}
/**
* @param collectorTable the collectorTable to set
*/
public void setCollectorTable(Table collectorTable)
{
this.collectorTable = collectorTable;
}
/**
* @return the collectorTable
*/
public Table getCollectorTable()
{
return collectorTable;
}
/**
* @param collectorColumnList the collectorColumnList to set
*/
public void setCollectorColumnList(ArrayList<Column> collectorColumnList)
{
this.collectorColumnList = collectorColumnList;
}
/**
* @return the collectorColumnList
*/
public ArrayList<Column> getCollectorColumnList()
{
return collectorColumnList;
}
/**
* @return the isMainActivity
*/
public boolean isMainActivity()
{
return isMainActivity;
}
/**
* @param isMainActivity the isMainActivity to set
*/
public void setMainActivity(boolean isMainActivity)
{
this.isMainActivity = isMainActivity;
}
public String getSqlOpenHelperClassName()
{
return sqlOpenHelperClassName;
}
public void setSqlOpenHelperClassName(String sqlOpenHelperClassName)
{
this.sqlOpenHelperClassName = sqlOpenHelperClassName;
}
public String getSqlOpenHelperPackageName()
{
return sqlOpenHelperPackageName;
}
public void setSqlOpenHelperPackageName(String sqlOpenHelperPackageName)
{
this.sqlOpenHelperPackageName = sqlOpenHelperPackageName;
}
public boolean isSqlOpenHelperDefined()
{
return sqlOpenHelperDefined;
}
public void setSqlOpenHelperDefined(boolean sqlOpenHelperDefined)
{
this.sqlOpenHelperDefined = sqlOpenHelperDefined;
}
}