/* * 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); } } }