Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (C) 2010-2012 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 com.googlecode.androidannotations.processing;
 
 import static com.sun.codemodel.JExpr.invoke;
 import static com.sun.codemodel.JExpr.lit;
 import static com.sun.codemodel.JMod.PRIVATE;
 import static com.sun.codemodel.JMod.STATIC;
 
 import java.util.List;
 import java.util.Map;
 
 
 
 public class SharedPrefProcessor implements ElementProcessor {
 
 	private static class EditorFieldHolder {
 		public final Class<?> fieldClass;
 		public final String fieldMethodName;
 
 		public EditorFieldHolder(Class<?> fieldClassString fieldMethodName) {
 			this. = fieldClass;
 			this. = fieldMethodName;
 		}
 	}
 
 	private static final Map<StringEditorFieldHolderEDITOR_FIELD_BY_TYPE = new HashMap<StringEditorFieldHolder>() {
 		private static final long serialVersionUID = 1L;
 		{
 			put("boolean"new EditorFieldHolder(BooleanPrefEditorField.class"booleanField"));
 			put("float"new EditorFieldHolder(FloatPrefEditorField.class"floatField"));
 			put("int"new EditorFieldHolder(IntPrefEditorField.class"intField"));
 			put("long"new EditorFieldHolder(LongPrefEditorField.class"longField"));
 			put("java.lang.String"new EditorFieldHolder(StringPrefEditorField.class"stringField"));
 		}
 	};
 
 	public Class<? extends AnnotationgetTarget() {
 		return SharedPref.class;
 	}
 
 	public void process(Element elementJCodeModel codeModelEBeansHolder activitiesHolderthrows Exception {
 
 		TypeElement typeElement = (TypeElementelement;
 
 		String interfaceQualifiedName = typeElement.getQualifiedName().toString();
 		String interfaceSimpleName = typeElement.getSimpleName().toString();
		String helperQualifiedName = interfaceQualifiedName + .;
		JDefinedClass helperClass = codeModel._class(. | .helperQualifiedName.);
		// Extracting valid methods
		List<? extends Elementmembers = typeElement.getEnclosedElements();
		List<ExecutableElementmethods = ElementFilter.methodsIn(members);
		for (ExecutableElement method : methods) {
			validMethods.add(method);
		}
		// Static editor class
		JDefinedClass editorClass = helperClass._class(. | . | .interfaceSimpleName + "Editor" + .);
		editorClass._extends(codeModel.ref(EditorHelper.class).narrow(editorClass));
		// Editor constructor
		JMethod editorConstructor = editorClass.constructor(.);
		JClass sharedPreferencesClass = codeModel.ref("android.content.SharedPreferences");
		JVar sharedPreferencesParam = editorConstructor.param(sharedPreferencesClass"sharedPreferences");
		editorConstructor.body().invoke("super").arg(sharedPreferencesParam);
		// Editor field methods
		for (ExecutableElement method : validMethods) {
			String returnType = method.getReturnType().toString();
			EditorFieldHolder editorFieldHolder = .get(returnType);
			JClass editorFieldClass = codeModel.ref(editorFieldHolder.fieldClass);
			String fieldName = method.getSimpleName().toString();
			JMethod editorFieldMethod = editorClass.method(.editorFieldClass.narrow(editorClass), fieldName);
			editorFieldMethod.body()._return(JExpr.invoke(editorFieldHolder.fieldMethodName).arg(fieldName));
		}
		// Helper constructor
		JClass contextClass = codeModel.ref("android.content.Context");
		SharedPref sharedPrefAnnotation = typeElement.getAnnotation(SharedPref.class);
		Scope scope = sharedPrefAnnotation.value();
		int mode = sharedPrefAnnotation.mode();
		JMethod constructor = helperClass.constructor(.);
		switch (scope) {
			JVar contextParam = constructor.param(contextClass"context");
			JMethod getLocalClassName = getLocalClassName(helperClasscodeModel);
			constructor.body().invoke("super"//
					.arg(contextParam.invoke("getSharedPreferences"//
							.arg(invoke(getLocalClassName).arg(contextParam)) //
							.arg(JExpr.lit(mode)));
			break;
		}
		case : {
			JVar contextParam = constructor.param(contextClass"context");
			JMethod getLocalClassName = getLocalClassName(helperClasscodeModel);
			constructor.body().invoke("super"//
					.arg(contextParam.invoke("getSharedPreferences"//
							.arg(invoke(getLocalClassName).arg(contextParam//
									.plus(JExpr.lit("_" + interfaceSimpleName))) //
							.arg(JExpr.lit(mode)));
			break;
		}
		case : {
			JVar contextParam = constructor.param(contextClass"context");
			constructor.body() //
					.invoke("super"//
					.arg(contextParam.invoke("getSharedPreferences"//
							.arg(JExpr.lit(interfaceSimpleName)) //
							.arg(JExpr.lit(mode)));
			break;
		}
			JClass preferenceManagerClass = codeModel.ref("android.preference.PreferenceManager");
			JVar contextParam = constructor.param(contextClass"context");
			constructor.body() //
					.invoke("super"//
					.arg(preferenceManagerClass.staticInvoke("getDefaultSharedPreferences"//
							.arg(contextParam));
			break;
		}
		}
		// Helper edit method
		JMethod editMethod = helperClass.method(.editorClass"edit");
		editMethod.body()._return(JExpr._new(editorClass).arg(JExpr.invoke("getSharedPreferences")));
		// Helper field methods
		for (ExecutableElement method : validMethods) {
			String returnType = method.getReturnType().toString();
			String fieldName = method.getSimpleName().toString();
			if ("boolean".equals(returnType)) {
				JExpression defaultValue;
				DefaultBoolean defaultAnnotation = method.getAnnotation(DefaultBoolean.class);
				if (defaultAnnotation != null) {
					defaultValue = JExpr.lit(defaultAnnotation.value());
else {
					defaultValue = JExpr.lit(false);
				}
				addFieldHelperMethod(helperClassfieldNamedefaultValueBooleanPrefField.class"booleanField");
else if ("float".equals(returnType)) {
				JExpression defaultValue;
				DefaultFloat defaultAnnotation = method.getAnnotation(DefaultFloat.class);
				if (defaultAnnotation != null) {
					defaultValue = JExpr.lit(defaultAnnotation.value());
else {
					defaultValue = JExpr.lit(0f);
				}
				addFieldHelperMethod(helperClassfieldNamedefaultValueFloatPrefField.class"floatField");
else if ("int".equals(returnType)) {
				JExpression defaultValue;
				DefaultInt defaultAnnotation = method.getAnnotation(DefaultInt.class);
				if (defaultAnnotation != null) {
					defaultValue = JExpr.lit(defaultAnnotation.value());
else {
					defaultValue = JExpr.lit(0);
				}
				addFieldHelperMethod(helperClassfieldNamedefaultValueIntPrefField.class"intField");
else if ("long".equals(returnType)) {
				JExpression defaultValue;
				DefaultLong defaultAnnotation = method.getAnnotation(DefaultLong.class);
				if (defaultAnnotation != null) {
					defaultValue = JExpr.lit(defaultAnnotation.value());
else {
					defaultValue = JExpr.lit(0l);
				}
				addFieldHelperMethod(helperClassfieldNamedefaultValueLongPrefField.class"longField");
else if ("java.lang.String".equals(returnType)) {
				JExpression defaultValue;
				DefaultString defaultAnnotation = method.getAnnotation(DefaultString.class);
				if (defaultAnnotation != null) {
					defaultValue = JExpr.lit(defaultAnnotation.value());
else {
					defaultValue = JExpr.lit("");
				}
				addFieldHelperMethod(helperClassfieldNamedefaultValueStringPrefField.class"stringField");
			}
		}
	}
	private void addFieldHelperMethod(JDefinedClass helperClassString fieldNameJExpression defaultValueClass<?> prefFieldHelperClassString fieldHelperMethodName) {
		JMethod fieldMethod = helperClass.method(.prefFieldHelperClassfieldName);
		fieldMethod.body()._return(JExpr.invoke(fieldHelperMethodName).arg(fieldName).arg(defaultValue));
	}
	private JMethod getLocalClassName(JDefinedClass helperClassJCodeModel codeModel) {
		JClass stringClass = codeModel.ref(String.class);
		JMethod getLocalClassName = helperClass.method( | stringClass"getLocalClassName");
		JClass contextClass = codeModel.ref("android.content.Context");
		JVar contextParam = getLocalClassName.param(contextClass"context");
		JBlock body = getLocalClassName.body();
		JVar packageName = body.decl(stringClass"packageName"contextParam.invoke("getPackageName"));
		JVar className = body.decl(stringClass"className"contextParam.invoke("getClass").invoke("getName"));
		JVar packageLen = body.decl(codeModel.INT"packageLen"packageName.invoke("length"));
		JExpression condition = className.invoke("startsWith").arg(packageName).not() //
				.cor(className.invoke("length").lte(packageLen)) //
				.cor(className.invoke("charAt").arg(packageLen).ne(lit('.')));
		body._if(condition)._then()._return(className);
		body._return(className.invoke("substring").arg(packageLen.plus(lit(1))));
		return getLocalClassName;
	}
New to GrepCode? Check out our FAQ X