diff options
Diffstat (limited to 'src/plugins/android.codeutils/src/com/motorola/studio/android/model/Service.java')
-rw-r--r-- | src/plugins/android.codeutils/src/com/motorola/studio/android/model/Service.java | 387 |
1 files changed, 387 insertions, 0 deletions
diff --git a/src/plugins/android.codeutils/src/com/motorola/studio/android/model/Service.java b/src/plugins/android.codeutils/src/com/motorola/studio/android/model/Service.java new file mode 100644 index 0000000..eeb6197 --- /dev/null +++ b/src/plugins/android.codeutils/src/com/motorola/studio/android/model/Service.java @@ -0,0 +1,387 @@ +/* + * 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.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jface.wizard.IWizardContainer; +import org.eclipse.osgi.util.NLS; + +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.manifest.AndroidProjectManifestFile; +import com.motorola.studio.android.model.java.ServiceClass; +import com.motorola.studio.android.model.manifest.AndroidManifestFile; +import com.motorola.studio.android.model.manifest.dom.ApplicationNode; +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.ServiceNode; +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.model.resources.types.StringNode; +import com.motorola.studio.android.resources.AndroidProjectResources; + +/** + * Class that provides a service model to be used for the service wizard. + */ +public class Service extends Launcher +{ + private static final String SERVICE_RESOURCE_LABEL_SUFFIX = "ServiceLabel"; //$NON-NLS-1$ + + private static final int MANIFEST_UPDATING_STEPS = 6; + + private static final int RESOURCES_UPDATING_STEPS = 3; + + private boolean onStartMethod; + + private boolean onCreateMethod; + + /** + * Default constructor. + * */ + public Service() + { + super(IAndroidConstants.CLASS_SERVICE); + } + + /* + * (non-Javadoc) + * @see com.motorola.studio.android.model.BuildingBlockModel#getStatus() + */ + @Override + public IStatus getStatus() + { + return super.getStatus(); + } + + /** + * Create a new service class and add it to the manifest file. + * @return True if the service class was successfully created and added to the manifest file. Otherwise, returns false. + * */ + @Override + public boolean save(IWizardContainer container, IProgressMonitor monitor) + throws AndroidException + { + boolean classCreated = createServiceClass(monitor); + boolean addedOnManifest = false; + + if (classCreated) + { + addedOnManifest = createServiceOnManifest(monitor); + } + + // Logs all permissions used in UDC log + super.save(container, monitor); + + return classCreated && addedOnManifest; + } + + /* + * (non-Javadoc) + * @see com.motorola.studio.android.model.IWizardModel#needMoreInformation() + */ + public boolean needMoreInformation() + { + return false; + } + + /* + * Creates the Service java class + * + * @param monitor the progress monitor + * + * @return true if the class has been created or false otherwise + * @throws AndroidException + */ + private boolean createServiceClass(IProgressMonitor monitor) throws AndroidException + { + boolean created = false; + + monitor.subTask(CodeUtilsNLS.UI_Service_CreatingTheServiceJavaClass); + + ServiceClass serviceClass = + new ServiceClass(getName(), getPackageFragment().getElementName(), onCreateMethod, + onStartMethod); + + try + { + createJavaClassFile(serviceClass, monitor); + created = true; + } + catch (JavaModelException e) + { + String errMsg = + NLS.bind(CodeUtilsNLS.EXC_Service_CannotCreateTheServiceClass, getName(), + e.getLocalizedMessage()); + + throw new AndroidException(errMsg); + } + catch (AndroidException e) + { + String errMsg = + NLS.bind(CodeUtilsNLS.EXC_Service_CannotCreateTheServiceClass, getName(), + e.getLocalizedMessage()); + throw new AndroidException(errMsg); + } + + return created; + } + + /* + * Creates the Service 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 createServiceOnManifest(IProgressMonitor monitor) throws AndroidException + { + boolean created = false; + + try + { + int totalWork = MANIFEST_UPDATING_STEPS + RESOURCES_UPDATING_STEPS; + + monitor.beginTask("", totalWork); + + 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()) + { + permissionsNames.add(i.getName()); + } + + for (String intentFilterPermission : getIntentFilterPermissionsAsArray()) + { + if (!permissionsNames.contains(intentFilterPermission)) + { + manifestNode.addChild(new UsesPermissionNode(intentFilterPermission)); + } + } + + boolean serviceExists = false; + + String classQualifier = + (getPackageFragment().getElementName() + .equals(manifestNode.getPackageName()) ? "" : getPackageFragment() //$NON-NLS-1$ + .getElementName()) + "."; //$NON-NLS-1$ + + for (ServiceNode serviceNode : applicationNode.getServiceNodes()) + { + if (serviceNode.getName().equals(getName())) + { + serviceExists = true; + break; + } + } + + monitor.worked(1); + + if (!serviceExists) + { + ServiceNode serviceNode = new ServiceNode(classQualifier + getName()); + + String serviceLabel = createServiceLabel(monitor); + + if (serviceLabel != null) + { + serviceNode.setLabel(AndroidProjectResources.STRING_CALL_PREFIX + + serviceLabel); + } + + IntentFilterNode intentFilterNode = new IntentFilterNode(); + + if (intentFilterNode.getChildren().length > 0) + { + serviceNode.addIntentFilterNode(intentFilterNode); + } + + applicationNode.addServiceNode(serviceNode); + + monitor.worked(1); + + monitor.subTask(CodeUtilsNLS.UI_Common_SavingTheAndroidManifestXMLFile); + + AndroidProjectManifestFile.saveToProject(getProject(), androidManifestFile, + true); + created = true; + + monitor.worked(1); + } + } + } + catch (AndroidException e) + { + String errMsg = + NLS.bind(CodeUtilsNLS.EXC_Service_CannotUpdateTheManifestFile, getName(), + e.getLocalizedMessage()); + throw new AndroidException(errMsg); + } + catch (CoreException e) + { + String errMsg = + NLS.bind(CodeUtilsNLS.EXC_Service_CannotUpdateTheManifestFile, getName(), + e.getLocalizedMessage()); + throw new AndroidException(errMsg); + } + finally + { + monitor.done(); + } + + return created; + } + + /* + * Adds the Service 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 + */ + private String createServiceLabel(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() + SERVICE_RESOURCE_LABEL_SUFFIX); + + StringNode strNode = new 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_Service_CannotCreateTheServiceLabel, + e.getLocalizedMessage()); + throw new AndroidException(errMsg); + } + catch (AndroidException e) + { + String errMsg = + NLS.bind(CodeUtilsNLS.EXC_Service_CannotCreateTheServiceLabel, + e.getLocalizedMessage()); + throw new AndroidException(errMsg); + } + } + + return resLabel; + } + + /** + * @return True if the default onStart() method of the service class should be created. Otherwise, returns false. + */ + public boolean isOnStartMethod() + { + return onStartMethod; + } + + /** + * @param onStartMethod Set to true to have the default onStart() method of the service class automatically created. + */ + public void setOnStartMethod(boolean onStartMethod) + { + this.onStartMethod = onStartMethod; + } + + /** + * @return True if the default onCreate() method of the service class should be created. Otherwise, returns false. + */ + public boolean isOnCreateMethod() + { + return onCreateMethod; + } + + /** + * @param onStartMethod Set to true to have the default onCreate() method of the service class automatically created. + */ + public void setOnCreateMethod(boolean onCreateMethod) + { + this.onCreateMethod = onCreateMethod; + } + + /** + * @return The default onStart() method signature including return value and visibility level. + */ + public String getOnStartMessage() + { + final String ON_START_METHOD = "public void onStart(Intent intent, int startId)"; + + return ON_START_METHOD; //$NON-NLS-1$ + } + + /** + * @return The default onCreate() method signature including return value and visibility level. + */ + public String getOnCreateMessage() + { + final String ON_CREATE_METHOD = "public void onCreate()"; + + return ON_CREATE_METHOD; //$NON-NLS-1$ + } +} |