com.motorola.studio.android.model.java.WidgetProviderClass.java Source code

Java tutorial

Introduction

Here is the source code for com.motorola.studio.android.model.java.WidgetProviderClass.java

Source

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

}