/** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group * * 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 org.androidannotations.internal.core.handler; import java.util.List; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import org.androidannotations.AndroidAnnotationsEnvironment; import org.androidannotations.ElementValidation; import org.androidannotations.annotations.BeforeTextChange; import org.androidannotations.helper.CanonicalNameConstants; import org.androidannotations.helper.IdValidatorHelper; import org.androidannotations.holder.EComponentWithViewSupportHolder; import org.androidannotations.holder.TextWatcherHolder; import org.androidannotations.rclass.IRClass; import com.helger.jcodemodel.IJExpression; import com.helger.jcodemodel.JBlock; import com.helger.jcodemodel.JFieldRef; import com.helger.jcodemodel.JInvocation; import com.helger.jcodemodel.JVar; public class BeforeTextChangeHandler extends CoreBaseAnnotationHandler<EComponentWithViewSupportHolder> { public BeforeTextChangeHandler(AndroidAnnotationsEnvironment environment) { super(BeforeTextChange.class, environment); } @Override public void validate(Element element, ElementValidation validation) { validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validation); validatorHelper.resIdsExist(element, IRClass.Res.ID, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, validation); validatorHelper.isNotPrivate(element, validation); validatorHelper.doesntThrowException(element, validation); validatorHelper.returnTypeIsVoid((ExecutableElement) element, validation); coreValidatorHelper.hasBeforeTextChangedMethodParameters((ExecutableElement) element, validation); } @Override public void process(Element element, EComponentWithViewSupportHolder holder) throws Exception { String methodName = element.getSimpleName().toString(); ExecutableElement executableElement = (ExecutableElement) element; List<? extends VariableElement> parameters = executableElement.getParameters(); int startParameterPosition = -1; int countParameterPosition = -1; int afterParameterPosition = -1; int charSequenceParameterPosition = -1; int viewParameterPosition = -1; TypeMirror viewParameterType = null; for (int i = 0; i < parameters.size(); i++) { VariableElement parameter = parameters.get(i); String parameterName = parameter.toString(); TypeMirror parameterType = parameter.asType(); if (CanonicalNameConstants.CHAR_SEQUENCE.equals(parameterType.toString())) { charSequenceParameterPosition = i; } else if (parameterType.getKind() == TypeKind.INT || CanonicalNameConstants.INTEGER.equals(parameterType.toString())) { if ("start".equals(parameterName)) { startParameterPosition = i; } else if ("count".equals(parameterName)) { countParameterPosition = i; } else if ("after".equals(parameterName)) { afterParameterPosition = i; } } else { TypeMirror textViewType = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.TEXT_VIEW).asType(); if (annotationHelper.isSubtype(parameterType, textViewType)) { viewParameterPosition = i; viewParameterType = parameterType; } } } List<JFieldRef> idsRefs = annotationHelper.extractAnnotationFieldRefs(element, IRClass.Res.ID, true); for (JFieldRef idRef : idsRefs) { TextWatcherHolder textWatcherHolder = holder.getTextWatcherHolder(idRef, viewParameterType); JBlock methodBody = textWatcherHolder.getBeforeTextChangedBody(); IJExpression activityRef = holder.getGeneratedClass().staticRef("this"); JInvocation textChangeCall = methodBody.invoke(activityRef, methodName); for (int i = 0; i < parameters.size(); i++) { if (i == startParameterPosition) { JVar startParameter = textWatcherHolder.getBeforeTextChangedStartParam(); textChangeCall.arg(startParameter); } else if (i == countParameterPosition) { JVar countParameter = textWatcherHolder.getBeforeTextChangedCountParam(); textChangeCall.arg(countParameter); } else if (i == afterParameterPosition) { JVar afterParameter = textWatcherHolder.getBeforeTextChangedAfterParam(); textChangeCall.arg(afterParameter); } else if (i == charSequenceParameterPosition) { JVar charSequenceParam = textWatcherHolder.getBeforeTextChangedCharSequenceParam(); textChangeCall.arg(charSequenceParam); } else if (i == viewParameterPosition) { JVar viewParameter = textWatcherHolder.getTextViewVariable(); textChangeCall.arg(viewParameter); } } } } }