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