Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,25 @@ public final class CanonicalNameConstants {
public static final String VIEW_PAGER = "android.support.v4.view.ViewPager";
public static final String PAGE_CHANGE_LISTENER = "android.support.v4.view.ViewPager.OnPageChangeListener";

/*
* Android X
*/
public static final String ANDROIDX_ACTIVITY_COMPAT = "androidx.core.app.ActivityCompat";
public static final String ANDROIDX_FRAGMENT = "androidx.fragment.app.Fragment";
public static final String ANDROIDX_FRAGMENT_ACTIVITY = "androidx.fragment.app.FragmentActivity";
public static final String ANDROIDX_LOCAL_BROADCAST_MANAGER = "androidx.localbroadcastmanager.content.LocalBroadcastManager";
public static final String ANDROIDX_CONTEXT_COMPAT = "androidx.core.content.ContextCompat";
public static final String ANDROIDX_PREFERENCE = "androidx.preference.Preference";
public static final String ANDROIDX_PREFERENCE_FRAGMENT = "androidx.preference.PreferenceFragment";
public static final String ANDROIDX_PREFERENCE_FRAGMENTCOMPAT = "androidx.preference.PreferenceFragmentCompat";
public static final String ANDROIDX_PREFERENCE_CLICK_LISTENER = "androidx.preference.Preference.OnPreferenceClickListener";
public static final String ANDROIDX_PREFERENCE_CHANGE_LISTENER = "androidx.preference.Preference.OnPreferenceChangeListener";
public static final String ANDROIDX_APPCOMPAT_ACTIVITY = "androidx.appcompat.app.AppCompatActivity";
public static final String ANDROIDX_VIEW_PAGER = "androidx.viewpager.widget.ViewPager";
public static final String ANDROIDX_PAGE_CHANGE_LISTENER = "androidx.viewpager.widget.ViewPager.OnPageChangeListener";
public static final String ANDROIDX_DATA_BINDING_UTIL = "androidx.databinding.DataBindingUtil";
public static final String ANDROIDX_VIEW_DATA_BINDING = "androidx.databinding.ViewDataBinding";

/*
* Android permission
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,13 @@
@SuppressWarnings("checkstyle:methodcount")
public class ValidatorHelper {

private static final List<String> ANDROID_FRAGMENT_QUALIFIED_NAMES = asList(CanonicalNameConstants.FRAGMENT, CanonicalNameConstants.SUPPORT_V4_FRAGMENT);
private static final List<String> ANDROID_FRAGMENT_QUALIFIED_NAMES = asList(CanonicalNameConstants.FRAGMENT, CanonicalNameConstants.SUPPORT_V4_FRAGMENT, CanonicalNameConstants.ANDROIDX_FRAGMENT);

private static final Collection<Integer> VALID_LOG_LEVELS = asList(LOG_VERBOSE, LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR);

private static final List<String> VALID_PREFERENCE_CLASSES = asList(CanonicalNameConstants.PREFERENCE_ACTIVITY, CanonicalNameConstants.PREFERENCE_FRAGMENT,
CanonicalNameConstants.SUPPORT_V4_PREFERENCE_FRAGMENT, CanonicalNameConstants.MACHINARIUS_V4_PREFERENCE_FRAGMENT, CanonicalNameConstants.SUPPORT_V7_PREFERENCE_FRAGMENTCOMPAT,
CanonicalNameConstants.SUPPORT_V14_PREFERENCE_FRAGMENT);
CanonicalNameConstants.SUPPORT_V14_PREFERENCE_FRAGMENT, CanonicalNameConstants.ANDROIDX_PREFERENCE_FRAGMENT, CanonicalNameConstants.ANDROIDX_PREFERENCE_FRAGMENTCOMPAT);

protected final TargetAnnotationHelper annotationHelper;
private final ParcelerHelper parcelerHelper;
Expand Down Expand Up @@ -500,7 +500,7 @@ public void extendsListOfView(Element element, ElementValidation valid) {
}

public void extendsPreference(Element element, ElementValidation validation) {
extendsOneOfTypes(element, asList(CanonicalNameConstants.PREFERENCE, CanonicalNameConstants.SUPPORT_V7_PREFERENCE), validation);
extendsOneOfTypes(element, asList(CanonicalNameConstants.PREFERENCE, CanonicalNameConstants.SUPPORT_V7_PREFERENCE, CanonicalNameConstants.ANDROIDX_PREFERENCE), validation);
}

public void extendsOneOfTypes(Element element, List<String> typeQualifiedNames, ElementValidation valid) {
Expand Down Expand Up @@ -766,8 +766,9 @@ public void isPreferenceFragmentClassPresent(Element element, ElementValidation
}

public void isViewPagerClassPresent(ElementValidation validation) {
if (!isClassPresent(CanonicalNameConstants.VIEW_PAGER)) {
validation.addError("The class " + CanonicalNameConstants.VIEW_PAGER + " cannot be found. You have to include support v4 library");
if (!isClassPresent(CanonicalNameConstants.VIEW_PAGER) && !isClassPresent(CanonicalNameConstants.ANDROIDX_VIEW_PAGER)) {
validation.addError("The classes " + CanonicalNameConstants.VIEW_PAGER + " and " + CanonicalNameConstants.ANDROIDX_VIEW_PAGER
+ " cannot be found. You have to include support-v4 or androidx.viewpager library");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@

import static org.androidannotations.helper.ModelConstants.generationSuffix;

import org.androidannotations.helper.CanonicalNameConstants;

import com.helger.jcodemodel.AbstractJClass;
import com.helger.jcodemodel.IJExpression;
import com.helger.jcodemodel.JFieldVar;
import com.helger.jcodemodel.JMod;
Expand All @@ -38,11 +41,19 @@ JFieldVar getDataBindingField() {
}

private void setDataBindingField() {
dataBindingField = holder.generatedClass.field(JMod.PRIVATE, getClasses().VIEW_DATA_BINDING, "viewDataBinding" + generationSuffix());
AbstractJClass viewDataBinding = getClasses().VIEW_DATA_BINDING;
if (getEnvironment().getProcessingEnvironment().getElementUtils().getTypeElement(CanonicalNameConstants.ANDROIDX_VIEW_DATA_BINDING) != null) {
viewDataBinding = getClasses().ANDROIDX_VIEW_DATA_BINDING;
}
dataBindingField = holder.generatedClass.field(JMod.PRIVATE, viewDataBinding, "viewDataBinding" + generationSuffix());
}

IJExpression getDataBindingInflationExpression(IJExpression contentViewId, IJExpression container, boolean attachToRoot) {
return getClasses().DATA_BINDING_UTIL.staticInvoke("inflate") //
AbstractJClass dataBindingUtil = getClasses().DATA_BINDING_UTIL;
if (getEnvironment().getProcessingEnvironment().getElementUtils().getTypeElement(CanonicalNameConstants.ANDROIDX_DATA_BINDING_UTIL) != null) {
dataBindingUtil = getClasses().ANDROIDX_DATA_BINDING_UTIL;
}
return dataBindingUtil.staticInvoke("inflate") //
.arg(getClasses().LAYOUT_INFLATER.staticInvoke("from").arg(holder.getContextRef())) //
.arg(contentViewId) //
.arg(container) //
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,12 @@ protected void setFindNativeFragmentById() {

@Override
protected void setFindSupportFragmentById() {
JMethod method = generatedClass.method(PRIVATE, getClasses().SUPPORT_V4_FRAGMENT, "findSupportFragmentById");
JMethod method;
if (getProcessingEnvironment().getElementUtils().getTypeElement(CanonicalNameConstants.ANDROIDX_FRAGMENT) == null) {
method = getGeneratedClass().method(PRIVATE, getClasses().SUPPORT_V4_FRAGMENT, "findSupportFragmentById");
} else {
method = getGeneratedClass().method(PRIVATE, getClasses().ANDROIDX_FRAGMENT, "findSupportFragmentById");
}
JVar idParam = method.param(getCodeModel().INT, "id");
JBlock body = method.body();
body._return(invoke("getSupportFragmentManager").invoke("findFragmentById").arg(idParam));
Expand All @@ -352,7 +357,12 @@ protected void setFindNativeFragmentByTag() {

@Override
protected void setFindSupportFragmentByTag() {
JMethod method = generatedClass.method(PRIVATE, getClasses().SUPPORT_V4_FRAGMENT, "findSupportFragmentByTag");
JMethod method;
if (getProcessingEnvironment().getElementUtils().getTypeElement(CanonicalNameConstants.ANDROIDX_FRAGMENT) == null) {
method = getGeneratedClass().method(PRIVATE, getClasses().SUPPORT_V4_FRAGMENT, "findSupportFragmentByTag");
} else {
method = getGeneratedClass().method(PRIVATE, getClasses().ANDROIDX_FRAGMENT, "findSupportFragmentByTag");
}
JVar tagParam = method.param(getClasses().STRING, "tag");
JBlock body = method.body();
body._return(invoke("getSupportFragmentManager").invoke("findFragmentByTag").arg(tagParam));
Expand Down Expand Up @@ -583,7 +593,7 @@ public JMethod getGetLastNonConfigurationInstance() throws JClassAlreadyExistsEx

private void setGetLastNonConfigurationInstance() throws JClassAlreadyExistsException {
AnnotationHelper annotationHelper = new AnnotationHelper(getEnvironment());
TypeElement fragmentActivityTypeElement = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.FRAGMENT_ACTIVITY);
TypeElement fragmentActivityTypeElement = getFragmentActivity(annotationHelper);
TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(generatedClass._extends().fullName());
String getLastNonConfigurationInstanceName = "getLastNonConfigurationInstance";
if (fragmentActivityTypeElement != null && annotationHelper.isSubtype(typeElement.asType(), fragmentActivityTypeElement.asType())) {
Expand Down Expand Up @@ -618,7 +628,7 @@ public JVar getOnRetainNonConfigurationInstance() throws JClassAlreadyExistsExce

private void setOnRetainNonConfigurationInstance() throws JClassAlreadyExistsException {
AnnotationHelper annotationHelper = new AnnotationHelper(getEnvironment());
TypeElement fragmentActivityTypeElement = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.FRAGMENT_ACTIVITY);
TypeElement fragmentActivityTypeElement = getFragmentActivity(annotationHelper);
TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(generatedClass._extends().fullName());

String onRetainNonConfigurationInstanceName = "onRetainNonConfigurationInstance";
Expand All @@ -639,6 +649,14 @@ private void setOnRetainNonConfigurationInstance() throws JClassAlreadyExistsExc
methodBody._return(onRetainNonConfigurationInstance);
}

private TypeElement getFragmentActivity(AnnotationHelper annotationHelper) {
TypeElement supportFragmentActivity = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.FRAGMENT_ACTIVITY);
if (supportFragmentActivity == null) {
return annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.ANDROIDX_FRAGMENT_ACTIVITY);
}
return supportFragmentActivity;
}

@Override
public JBlock getOnActivityResultCaseBlock(int requestCode) {
return onActivityResultDelegate.getCaseBlock(requestCode);
Expand Down Expand Up @@ -776,6 +794,11 @@ public boolean usingSupportV7Preference() {
return preferencesHolder.usingSupportV7Preference();
}

@Override
public boolean usingAndroidxPreference() {
return preferencesHolder.usingAndroidxPreference();
}

public AbstractJClass getBasePreferenceClass() {
return preferencesHolder.getBasePreferenceClass();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,13 @@

import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;

import org.androidannotations.AndroidAnnotationsEnvironment;
import org.androidannotations.api.view.HasViews;
import org.androidannotations.api.view.OnViewChangedListener;
import org.androidannotations.api.view.OnViewChangedNotifier;
import org.androidannotations.helper.CanonicalNameConstants;
import org.androidannotations.internal.helper.ViewNotifierHelper;

import com.helger.jcodemodel.AbstractJClass;
Expand Down Expand Up @@ -207,18 +209,32 @@ public JMethod getFindSupportFragmentById() {
}

protected void setFindSupportFragmentById() {
findSupportFragmentById = getGeneratedClass().method(PRIVATE, getClasses().SUPPORT_V4_FRAGMENT, "findSupportFragmentById");
if (getProcessingEnvironment().getElementUtils().getTypeElement(CanonicalNameConstants.ANDROIDX_FRAGMENT) == null) {
findSupportFragmentById = getGeneratedClass().method(PRIVATE, getClasses().SUPPORT_V4_FRAGMENT, "findSupportFragmentById");
} else {
findSupportFragmentById = getGeneratedClass().method(PRIVATE, getClasses().ANDROIDX_FRAGMENT, "findSupportFragmentById");
}
JVar idParam = findSupportFragmentById.param(getCodeModel().INT, "id");

JBlock body = findSupportFragmentById.body();

body._if(getContextRef()._instanceof(getClasses().FRAGMENT_ACTIVITY).not())._then()._return(_null());
AbstractJClass fragmentActivity = getFragmentActivity();
body._if(getContextRef()._instanceof(fragmentActivity).not())._then()._return(_null());

JVar activityVar = body.decl(getClasses().FRAGMENT_ACTIVITY, "activity_", cast(getClasses().FRAGMENT_ACTIVITY, getContextRef()));
JVar activityVar = body.decl(fragmentActivity, "activity_", cast(fragmentActivity, getContextRef()));

body._return(activityVar.invoke("getSupportFragmentManager").invoke("findFragmentById").arg(idParam));
}

private AbstractJClass getFragmentActivity() {
Elements elementUtils = getProcessingEnvironment().getElementUtils();
if (elementUtils.getTypeElement(CanonicalNameConstants.ANDROIDX_FRAGMENT_ACTIVITY) != null) {
return getClasses().ANDROIDX_FRAGMENT_ACTIVITY;
} else {
return getClasses().FRAGMENT_ACTIVITY;
}
}

public JMethod getFindNativeFragmentByTag() {
if (findNativeFragmentByTag == null) {
setFindNativeFragmentByTag();
Expand Down Expand Up @@ -247,14 +263,19 @@ public JMethod getFindSupportFragmentByTag() {
}

protected void setFindSupportFragmentByTag() {
findSupportFragmentByTag = getGeneratedClass().method(PRIVATE, getClasses().SUPPORT_V4_FRAGMENT, "findSupportFragmentByTag");
if (getProcessingEnvironment().getElementUtils().getTypeElement(CanonicalNameConstants.ANDROIDX_FRAGMENT) == null) {
findSupportFragmentByTag = getGeneratedClass().method(PRIVATE, getClasses().SUPPORT_V4_FRAGMENT, "findSupportFragmentByTag");
} else {
findSupportFragmentByTag = getGeneratedClass().method(PRIVATE, getClasses().ANDROIDX_FRAGMENT, "findSupportFragmentByTag");
}
JVar tagParam = findSupportFragmentByTag.param(getClasses().STRING, "tag");

JBlock body = findSupportFragmentByTag.body();

body._if(getContextRef()._instanceof(getClasses().FRAGMENT_ACTIVITY).not())._then()._return(_null());
AbstractJClass fragmentActivity = getFragmentActivity();
body._if(getContextRef()._instanceof(fragmentActivity).not())._then()._return(_null());

JVar activityVar = body.decl(getClasses().FRAGMENT_ACTIVITY, "activity_", cast(getClasses().FRAGMENT_ACTIVITY, getContextRef()));
JVar activityVar = body.decl(fragmentActivity, "activity_", cast(fragmentActivity, getContextRef()));

body._return(activityVar.invoke("getSupportFragmentManager").invoke("findFragmentByTag").arg(tagParam));
}
Expand All @@ -279,7 +300,7 @@ private TextWatcherHolder createTextWatcherHolder(JFieldRef idRef, TypeMirror vi
JBlock onViewChangedBody = getOnViewChangedBodyInjectionBlock().blockSimple();
JVar viewVariable = onViewChangedBody.decl(FINAL, viewClass, "view", cast(viewClass, findViewById(idRef)));
onViewChangedBody._if(viewVariable.ne(JExpr._null()))._then() //
.invoke(viewVariable, "addTextChangedListener").arg(_new(onTextChangeListenerClass));
.invoke(viewVariable, "addTextChangedListener").arg(_new(onTextChangeListenerClass));

return new TextWatcherHolder(this, viewVariable, onTextChangeListenerClass);
}
Expand Down Expand Up @@ -315,8 +336,15 @@ public PageChangeHolder getPageChangeHolder(JFieldRef idRef, TypeMirror viewPara
}

private PageChangeHolder createPageChangeHolder(JFieldRef idRef, TypeMirror viewParameterType, boolean hasAddOnPageChangeListenerMethod) {
JDefinedClass onPageChangeListenerClass = getCodeModel().anonymousClass(getClasses().PAGE_CHANGE_LISTENER);
AbstractJClass viewClass = getClasses().VIEW_PAGER;
AbstractJClass viewClass;
JDefinedClass onPageChangeListenerClass;
if (getProcessingEnvironment().getElementUtils().getTypeElement(CanonicalNameConstants.ANDROIDX_VIEW_PAGER) == null) {
viewClass = getClasses().VIEW_PAGER;
onPageChangeListenerClass = getCodeModel().anonymousClass(getClasses().PAGE_CHANGE_LISTENER);
} else {
viewClass = getClasses().ANDROIDX_VIEW_PAGER;
onPageChangeListenerClass = getCodeModel().anonymousClass(getClasses().ANDROIDX_PAGE_CHANGE_LISTENER);
}
if (viewParameterType != null) {
viewClass = getJClass(viewParameterType.toString());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,11 @@ public boolean usingSupportV7Preference() {
return preferencesDelegate.usingSupportV7Preference();
}

@Override
public boolean usingAndroidxPreference() {
return preferencesDelegate.usingAndroidxPreference();
}

public AbstractJClass getBasePreferenceClass() {
return preferencesDelegate.getBasePreferenceClass();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,7 @@ public interface HasPreferences extends GeneratedClassHolder {

boolean usingSupportV7Preference();

boolean usingAndroidxPreference();

AbstractJClass getBasePreferenceClass();
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,13 @@
import com.helger.jcodemodel.JMethod;
import com.helger.jcodemodel.JVar;

public class PreferencesDelegate extends GeneratedClassHolderDelegate<EComponentWithViewSupportHolder>implements HasPreferences {
public class PreferencesDelegate extends GeneratedClassHolderDelegate<EComponentWithViewSupportHolder> implements HasPreferences {

protected JBlock addPreferencesFromResourceInjectionBlock;
protected JBlock addPreferencesFromResourceAfterInjectionBlock;

private boolean usingSupportV7Preference = false;
private boolean usingAndroidxPreference = false;
private AbstractJClass basePreferenceClass;

public PreferencesDelegate(EComponentWithViewSupportHolder holder) {
Expand All @@ -51,12 +52,17 @@ public PreferencesDelegate(EComponentWithViewSupportHolder holder) {
Types typeUtils = holder.getEnvironment().getProcessingEnvironment().getTypeUtils();

TypeElement supportV7PreferenceFragmentCompat = elementUtils.getTypeElement(CanonicalNameConstants.SUPPORT_V7_PREFERENCE_FRAGMENTCOMPAT);

TypeElement andoridxPreferenceFragmentCompat = elementUtils.getTypeElement(CanonicalNameConstants.ANDROIDX_PREFERENCE_FRAGMENTCOMPAT);
TypeElement supportV14PreferenceFragment = elementUtils.getTypeElement(CanonicalNameConstants.SUPPORT_V14_PREFERENCE_FRAGMENT);
TypeElement andoridxPreferenceFragment = elementUtils.getTypeElement(CanonicalNameConstants.ANDROIDX_PREFERENCE_FRAGMENT);

TypeMirror annotatedType = holder.getAnnotatedElement().asType();

if (supportV7PreferenceFragmentCompat != null && typeUtils.isSubtype(annotatedType, supportV7PreferenceFragmentCompat.asType())
if (andoridxPreferenceFragmentCompat != null && typeUtils.isSubtype(annotatedType, andoridxPreferenceFragmentCompat.asType())
|| andoridxPreferenceFragment != null && typeUtils.isSubtype(annotatedType, andoridxPreferenceFragment.asType())) {
usingAndroidxPreference = true;
basePreferenceClass = getClasses().ANDROIDX_PREFERENCE;
} else if (supportV7PreferenceFragmentCompat != null && typeUtils.isSubtype(annotatedType, supportV7PreferenceFragmentCompat.asType())
|| supportV14PreferenceFragment != null && typeUtils.isSubtype(annotatedType, supportV14PreferenceFragment.asType())) {
usingSupportV7Preference = true;
basePreferenceClass = getClasses().SUPPORT_V7_PREFERENCE;
Expand Down Expand Up @@ -117,6 +123,11 @@ public boolean usingSupportV7Preference() {
return usingSupportV7Preference;
}

@Override
public boolean usingAndroidxPreference() {
return usingAndroidxPreference;
}

@Override
public AbstractJClass getBasePreferenceClass() {
return basePreferenceClass;
Expand Down
Loading