blob: 11e36bb2acd8e0448415b56453f49dccb2821b64 [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.java;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ImportDeclaration;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;
import org.eclipse.jdt.core.dom.PrimitiveType;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.osgi.util.NLS;
import org.eclipse.text.edits.MalformedTreeException;
import org.eclipse.text.edits.TextEdit;
import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS;
import com.motorola.studio.android.common.exception.AndroidException;
import com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.model.WidgetProvider;
/**
* Class used to create an Android Widget Provider building block class
*/
public class WidgetProviderClass extends JavaClass
{
private static final String[] INTENT_CLASS = getFQNAsArray("android.content.Intent");
private static final String[] CONTEXT_CLASS = getFQNAsArray("android.content.Context");
private static final String[] APP_WIDGET_MANAGER_CLASS =
getFQNAsArray("android.appwidget.AppWidgetManager");
private static final String ON_UPDATE_METHOD_NAME = "onUpdate";
private static final String ON_DELETED_METHOD_NAME = "onDeleted";
private static final String ON_ENABLED_METHOD_NAME = "onEnabled";
private static final String ON_DISABLED_METHOD_NAME = "onDisabled";
private static final String ON_RECEIVE_METHOD_NAME = "onReceive";
private ASTRewrite rewrite = null;
/**
* The constructor
*
* @param className The simple class name
* @param packageName The full-qualified class package name
*/
public WidgetProviderClass(String className, String packageName)
{
super(className, packageName, WidgetProvider.WIDGET_PROVIDER_SUPER_CLASS);
addBasicWidgetProviderInfo();
}
/**
* Adds basic information to the Widget Provider class
*/
@SuppressWarnings("unchecked")
private void addBasicWidgetProviderInfo()
{
// Adds import declarations
ImportDeclaration intentImport = ast.newImportDeclaration();
intentImport.setName(ast.newName(INTENT_CLASS));
compUnit.imports().add(intentImport);
ImportDeclaration contextImport = ast.newImportDeclaration();
contextImport.setName(ast.newName(CONTEXT_CLASS));
compUnit.imports().add(contextImport);
ImportDeclaration widgetManagerImport = ast.newImportDeclaration();
widgetManagerImport.setName(ast.newName(APP_WIDGET_MANAGER_CLASS));
compUnit.imports().add(widgetManagerImport);
// Add override methods
addOnUpdateMethod();
addOnDeletedMethod();
addOnEnabledMethod();
addOnDisabledMethod();
addOnReceiveMethod();
}
/**
* Adds the onUpdate method to the widget provider class
*/
@SuppressWarnings("unchecked")
private void addOnUpdateMethod()
{
final String WIDGET_IDS_PARAM = "appWidgetIds";
// Method declaration
MethodDeclaration onUpdateMethod = ast.newMethodDeclaration();
onUpdateMethod.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
onUpdateMethod.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));
onUpdateMethod.setName(ast.newSimpleName(ON_UPDATE_METHOD_NAME));
// Parameters
addMethodParameter(onUpdateMethod, getName(CONTEXT_CLASS).toLowerCase(),
ast.newSimpleType(ast.newSimpleName(getName(CONTEXT_CLASS))));
addMethodParameter(onUpdateMethod, getName(APP_WIDGET_MANAGER_CLASS).toLowerCase(),
ast.newSimpleType(ast.newSimpleName(getName(APP_WIDGET_MANAGER_CLASS))));
addMethodParameter(onUpdateMethod, WIDGET_IDS_PARAM, intArrayType());
addEmptyBlock(onUpdateMethod);
classDecl.bodyDeclarations().add(onUpdateMethod);
}
/**
* Adds the onDelete method to the widget provider class
*/
@SuppressWarnings("unchecked")
private void addOnDeletedMethod()
{
final String WIDGET_IDS_PARAM = "appWidgetIds";
// Method declaration
MethodDeclaration onDeletedMethod = ast.newMethodDeclaration();
onDeletedMethod.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
onDeletedMethod.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));
onDeletedMethod.setName(ast.newSimpleName(ON_DELETED_METHOD_NAME));
// Parameters
addMethodParameter(onDeletedMethod, getName(CONTEXT_CLASS).toLowerCase(),
ast.newSimpleType(ast.newSimpleName(getName(CONTEXT_CLASS))));
addMethodParameter(onDeletedMethod, WIDGET_IDS_PARAM, intArrayType());
addEmptyBlock(onDeletedMethod);
classDecl.bodyDeclarations().add(onDeletedMethod);
}
/**
* Adds the onEnabled method to the widget provider class
*/
@SuppressWarnings("unchecked")
private void addOnEnabledMethod()
{
// Method declaration
MethodDeclaration onEnabledMethod = ast.newMethodDeclaration();
onEnabledMethod.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
onEnabledMethod.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));
onEnabledMethod.setName(ast.newSimpleName(ON_ENABLED_METHOD_NAME));
// Parameters
addMethodParameter(onEnabledMethod, getName(CONTEXT_CLASS).toLowerCase(),
ast.newSimpleType(ast.newSimpleName(getName(CONTEXT_CLASS))));
addEmptyBlock(onEnabledMethod);
classDecl.bodyDeclarations().add(onEnabledMethod);
}
/**
* Adds the onDisabled method to the widget provider class
*/
@SuppressWarnings("unchecked")
private void addOnDisabledMethod()
{
// Method declaration
MethodDeclaration onDisabledMethod = ast.newMethodDeclaration();
onDisabledMethod.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
onDisabledMethod.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));
onDisabledMethod.setName(ast.newSimpleName(ON_DISABLED_METHOD_NAME));
// Parameters
addMethodParameter(onDisabledMethod, getName(CONTEXT_CLASS).toLowerCase(),
ast.newSimpleType(ast.newSimpleName(getName(CONTEXT_CLASS))));
addEmptyBlock(onDisabledMethod);
classDecl.bodyDeclarations().add(onDisabledMethod);
}
/**
* Adds the onReceive method to the widget provider class
*/
@SuppressWarnings("unchecked")
private void addOnReceiveMethod()
{
// Method declaration
MethodDeclaration onReceiveMethod = ast.newMethodDeclaration();
onReceiveMethod.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
onReceiveMethod.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));
onReceiveMethod.setName(ast.newSimpleName(ON_RECEIVE_METHOD_NAME));
// Parameters
addMethodParameter(onReceiveMethod, getName(CONTEXT_CLASS).toLowerCase(),
ast.newSimpleType(ast.newSimpleName(getName(CONTEXT_CLASS))));
addMethodParameter(onReceiveMethod, getName(INTENT_CLASS).toLowerCase(),
ast.newSimpleType(ast.newSimpleName(getName(INTENT_CLASS))));
addEmptyBlock(onReceiveMethod);
classDecl.bodyDeclarations().add(onReceiveMethod);
}
/* (non-Javadoc)
* @see com.motorola.studio.android.model.java.JavaClass#addComments()
*/
@Override
protected void addComments() throws AndroidException
{
ASTNode todoComment;
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(document.get().toCharArray());
compUnit = (CompilationUnit) parser.createAST(null);
ast = compUnit.getAST();
rewrite = ASTRewrite.create(ast);
todoComment =
rewrite.createStringPlaceholder(CodeUtilsNLS.MODEL_Common_ToDoPutYourCodeHere,
ASTNode.EMPTY_STATEMENT);
TypeDeclaration widgetProviderClass = (TypeDeclaration) compUnit.types().get(0);
MethodDeclaration method;
Block block;
// Adds the Override annotation and ToDo comment to all overridden methods
for (int i = 0; i < widgetProviderClass.bodyDeclarations().size(); i++)
{
method = (MethodDeclaration) widgetProviderClass.bodyDeclarations().get(i);
// Adds the Override annotation
rewrite.getListRewrite(method, method.getModifiersProperty()).insertFirst(
OVERRIDE_ANNOTATION, null);
// Adds the ToDo comment
block = method.getBody();
rewrite.getListRewrite(block, Block.STATEMENTS_PROPERTY).insertFirst(todoComment, null);
}
try
{
// Writes the modifications
TextEdit modifications = rewrite.rewriteAST(document, null);
modifications.apply(document);
}
catch (IllegalArgumentException e)
{
String errMsg =
NLS.bind(CodeUtilsNLS.EXC_JavaClass_ErrorApplyingCommentsToCode, className);
StudioLogger.error(BroadcastReceiverClass.class, errMsg, e);
throw new AndroidException(errMsg);
}
catch (MalformedTreeException e)
{
String errMsg =
NLS.bind(CodeUtilsNLS.EXC_JavaClass_ErrorApplyingCommentsToCode, className);
StudioLogger.error(BroadcastReceiverClass.class, errMsg, e);
throw new AndroidException(errMsg);
}
catch (BadLocationException e)
{
String errMsg =
NLS.bind(CodeUtilsNLS.EXC_JavaClass_ErrorApplyingCommentsToCode, className);
StudioLogger.error(BroadcastReceiverClass.class, errMsg, e);
throw new AndroidException(errMsg);
}
}
}