Skip to content

Commit 6bad476

Browse files
author
xiaoqi
committed
support activity and fragment
1 parent a8f5133 commit 6bad476

13 files changed

Lines changed: 218 additions & 77 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ ext {
2828
userOrg = 'xqand'
2929
groupId = 'com.xqand'
3030
uploadName = 'AutoSave'
31-
publishVersion = '1.0.0'
31+
publishVersion = '1.1.0'
3232
desc = 'A framework can automatically generate OnSaveInstanceState code'
3333
website = 'https://github.com/xiaoqiAndroid/AutoSave'
3434
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.xiaoqi.autosavesample;
2+
3+
import android.os.Bundle;
4+
import android.support.annotation.Nullable;
5+
import android.support.v4.app.Fragment;
6+
import android.view.LayoutInflater;
7+
import android.view.View;
8+
import android.view.ViewGroup;
9+
10+
import com.processor.NeedSave;
11+
import com.xqand.savehelper.SaveHelper;
12+
13+
import java.util.ArrayList;
14+
15+
public class BaseFragment extends Fragment {
16+
17+
18+
@Nullable
19+
@Override
20+
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle
21+
savedInstanceState) {
22+
return super.onCreateView(inflater, container, savedInstanceState);
23+
}
24+
25+
26+
@Override
27+
public void onSaveInstanceState(Bundle outState) {
28+
super.onSaveInstanceState(outState);
29+
}
30+
}
Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,36 @@
11
package com.xiaoqi.autosavesample;
22

3+
import android.os.Parcel;
4+
import android.os.Parcelable;
5+
36
import java.io.Serializable;
47

58
/**
69
* Created by xiaoqi on 2017/1/10.
710
*/
811

9-
public class Example implements Serializable{
12+
public class Example implements Parcelable{
13+
protected Example(Parcel in) {
14+
}
15+
16+
public static final Creator<Example> CREATOR = new Creator<Example>() {
17+
@Override
18+
public Example createFromParcel(Parcel in) {
19+
return new Example(in);
20+
}
21+
22+
@Override
23+
public Example[] newArray(int size) {
24+
return new Example[size];
25+
}
26+
};
27+
28+
@Override
29+
public int describeContents() {
30+
return 0;
31+
}
32+
33+
@Override
34+
public void writeToParcel(Parcel dest, int flags) {
35+
}
1036
}

sample/src/main/java/com/xiaoqi/autosavesample/MainActivity.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ public class MainActivity extends AppCompatActivity {
1414
@NeedSave
1515
public String test;
1616
@NeedSave
17-
public boolean b;
17+
private boolean b;
1818
@NeedSave
1919
public Boolean c;
2020
@NeedSave
2121
public ArrayList<String> t;
2222
@NeedSave
2323
public Integer i;
24-
@NeedSave
24+
@NeedSave(isParcelable = true)
2525
public Example example;
2626
@NeedSave
2727
public Float f1;
@@ -31,6 +31,13 @@ public class MainActivity extends AppCompatActivity {
3131
public char achar;
3232
@NeedSave
3333
public char achars[];
34+
@NeedSave
35+
public int sssss[];
36+
@NeedSave
37+
public int[] sasa;
38+
@NeedSave
39+
public Bundle bundle;
40+
3441
@Override
3542
protected void onCreate(Bundle savedInstanceState) {
3643
super.onCreate(savedInstanceState);
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.xiaoqi.autosavesample;
2+
3+
import android.os.Bundle;
4+
import android.support.annotation.Nullable;
5+
import android.view.LayoutInflater;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
9+
import com.processor.NeedSave;
10+
import com.xqand.savehelper.SaveHelper;
11+
12+
import java.util.ArrayList;
13+
14+
public class MainFragment extends BaseFragment {
15+
@NeedSave
16+
public int a;
17+
@NeedSave
18+
public String test;
19+
@NeedSave
20+
public boolean b;
21+
@NeedSave
22+
public Boolean c;
23+
@NeedSave
24+
public ArrayList<String> t;
25+
@NeedSave
26+
public Integer i;
27+
@NeedSave(isParcelable = true)
28+
public Example example;
29+
@NeedSave
30+
public Float f1;
31+
@NeedSave
32+
public float f2;
33+
@NeedSave
34+
public char achar;
35+
@NeedSave
36+
private char achars[];
37+
38+
39+
@Nullable
40+
@Override
41+
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle
42+
savedInstanceState) {
43+
SaveHelper.bind(this,savedInstanceState);
44+
return super.onCreateView(inflater, container, savedInstanceState);
45+
}
46+
47+
48+
@Override
49+
public void onSaveInstanceState(Bundle outState) {
50+
SaveHelper.save(this,outState);
51+
super.onSaveInstanceState(outState);
52+
}
53+
}
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.processor;
22

33
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
46
import java.lang.annotation.Target;
57

68
@Target(ElementType.FIELD)
9+
@Retention(RetentionPolicy.SOURCE)
710
public @interface NeedSave {
8-
11+
boolean isParcelable() default false;
912
}
Lines changed: 26 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.xqand.helper;
22

3+
import com.squareup.javapoet.ParameterizedTypeName;
34
import com.xqand.processor.HelperConfig;
45
import com.xqand.utils.TypeUtil;
56
import com.squareup.javapoet.ClassName;
@@ -8,7 +9,6 @@
89
import com.squareup.javapoet.TypeName;
910
import com.squareup.javapoet.TypeSpec;
1011

11-
import java.io.Serializable;
1212
import java.util.ArrayList;
1313

1414
import javax.annotation.processing.Messager;
@@ -38,44 +38,44 @@ public void addField(HelperSavedValues savedValues){
3838

3939
public JavaFile generateCode(){
4040
try {
41-
// ClassName cacheClass = ClassName.get(getPackageName(), getCacheClassName());
4241
TypeName cacheClass = ClassName.get(encloseElement.asType());
43-
MethodSpec.Builder saveMethodBuilder = MethodSpec.methodBuilder("save")
42+
MethodSpec.Builder saveMethodBuilder;
43+
MethodSpec.Builder recoverMethodBuilder;
44+
saveMethodBuilder = MethodSpec.methodBuilder("save")
4445
.addModifiers(Modifier.PUBLIC)
4546
.returns(void.class)
4647
.addParameter(TypeUtil.BUNDLE, "outState")
47-
.addParameter(TypeUtil.ACTITVITY, "activity")
48-
.addAnnotation(Override.class)
49-
.addStatement("$T recoverActivity = ($T)activity", cacheClass, cacheClass);
48+
.addParameter(cacheClass, "save")
49+
.addAnnotation(Override.class);
5050

51-
MethodSpec.Builder recoverMethodBuilder = MethodSpec.methodBuilder("recover")
51+
recoverMethodBuilder = MethodSpec.methodBuilder("recover")
5252
.addModifiers(Modifier.PUBLIC)
5353
.returns(void.class)
5454
.addParameter(TypeUtil.BUNDLE, "savedInstanceState")
55-
.addParameter(TypeUtil.ACTITVITY, "activity")
55+
.addParameter(cacheClass, "recover")
5656
.addAnnotation(Override.class)
57-
.beginControlFlow("if(savedInstanceState != null)")
58-
.addStatement("$T recoverActivity = ($T)activity", cacheClass, cacheClass);
57+
.beginControlFlow("if(savedInstanceState != null)");
5958

6059
for (HelperSavedValues value : elementArrayList) {
6160
Name fieldName = value.getSimpleName();
6261
String fieldType = value.getFieldType().toString();
63-
String type = getFieldType(fieldType);
62+
String type = HelperConfig.getFieldType(fieldType);
63+
//only support public field
64+
if(!value.isPublic()){
65+
continue;
66+
}
6467
if(!type.equals("unKnow")){
6568
addMethodStatement(saveMethodBuilder,recoverMethodBuilder, type, fieldName);
6669
}else {
67-
// Class c = Class.forName(fieldType);
68-
// Class[] interfaces = c.getInterfaces();
69-
// for (Class inter : interfaces) {
70-
// saveMethodBuilder.addStatement("//$N", inter.getName());
71-
// }
72-
if( value.getFieldType() instanceof Serializable){
73-
saveMethodBuilder.addStatement("outState.putSerializable($S,recoverActivity.$S)", fieldName.toString
74-
().toUpperCase(),fieldName);
75-
recoverMethodBuilder.addStatement("recoverActivity.$N = savedInstanceState.getSerializable($S)",
70+
if(value.isParcelable()){
71+
saveMethodBuilder.addStatement("outState.putParcelable($S,save.$N)", fieldName.toString().toUpperCase(),fieldName);
72+
recoverMethodBuilder.addStatement("recover.$N = savedInstanceState.getParcelable($S)",
7673
fieldName, fieldName.toString().toUpperCase());
7774
}else {
78-
saveMethodBuilder.addStatement("//$S", fieldType);
75+
saveMethodBuilder.addStatement("outState.putSerializable($S,save.$N)", fieldName.toString
76+
().toUpperCase(),fieldName);
77+
recoverMethodBuilder.addStatement("recover.$N = ($T)savedInstanceState.getSerializable($S)",
78+
fieldName, ClassName.get(value.getFieldType()),fieldName.toString().toUpperCase());
7979
}
8080
}
8181
}
@@ -86,16 +86,17 @@ public JavaFile generateCode(){
8686
String className = encloseElement.getSimpleName().toString() + HelperConfig.HELP_CLASS;
8787
TypeSpec cacheClassTypeSpec = TypeSpec.classBuilder(className)
8888
.addModifiers(Modifier.PUBLIC)
89-
.addSuperinterface(TypeUtil.IHELPER)
89+
.addSuperinterface(ParameterizedTypeName.get(TypeUtil.IHELPER, cacheClass))
9090
.addMethod(saveMethod)
9191
.addMethod(recoverMethod)
9292
.build();
93+
9394
JavaFile javaFile = JavaFile.builder(getPackageName(), cacheClassTypeSpec).build();
9495
return javaFile;
9596
} catch (Exception e) {
9697
e.printStackTrace();
98+
return null;
9799
}
98-
return null;
99100
}
100101

101102
private String getPackageName() {
@@ -119,12 +120,12 @@ private String upperFirstWord(String str){
119120
}
120121

121122
private void addSaveMethodStatement(MethodSpec.Builder saveMethodBuilder, String str, Name fieldName){
122-
saveMethodBuilder.addStatement(String.format("outState.put%s($S,recoverActivity.$N)",upperFirstWord(str)),
123+
saveMethodBuilder.addStatement(String.format("outState.put%s($S,save.$N)",upperFirstWord(str)),
123124
fieldName.toString().toUpperCase(),fieldName);
124125
}
125126

126127
private void addRecoverMethodStatement(MethodSpec.Builder recoverMethodBuilder, String str, Name fieldName){
127-
recoverMethodBuilder.addStatement(String.format("recoverActivity.$N = savedInstanceState.get%s($S)",upperFirstWord(str)),
128+
recoverMethodBuilder.addStatement(String.format("recover.$N = savedInstanceState.get%s($S)",upperFirstWord(str)),
128129
fieldName, fieldName.toString().toUpperCase());
129130
}
130131

@@ -133,28 +134,5 @@ private void addMethodStatement(MethodSpec.Builder saveMethodBuilder,MethodSpec.
133134
addRecoverMethodStatement(recoverMethodBuilder,str,fieldName);
134135
}
135136

136-
private String getFieldType(String fieldType){
137-
String type;
138-
if(fieldType.equals("java.lang.String")){
139-
type = "String";
140-
}else if(fieldType.equals("int") || fieldType.equals("java.lang.Integer")){
141-
type = "Int";
142-
}else if(fieldType.equals("short") || fieldType.equals("java.lang.Short")){
143-
type = "Short";
144-
}else if(fieldType.equals("double") || fieldType.equals("java.lang.Double")){
145-
type = "Double";
146-
}else if(fieldType.equals("float") || fieldType.equals("java.lang.Float")){
147-
type = "Float";
148-
}else if(fieldType.equals("boolean") || fieldType.equals("java.lang.Boolean")){
149-
type = "Boolean";
150-
}else if(fieldType.equals("char")){
151-
type = "Char";
152-
}else if(fieldType.equals("char[]")){
153-
type = "CharArray";
154-
}else {
155-
type = "unKnow";
156-
}
157-
return type;
158-
}
159137

160138
}

xqauto-processor/src/main/java/com/xqand/helper/HelperSavedValues.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package com.xqand.helper;
22

3+
import com.processor.NeedSave;
4+
5+
import java.util.Set;
6+
37
import javax.lang.model.element.Element;
8+
import javax.lang.model.element.Modifier;
49
import javax.lang.model.element.Name;
510
import javax.lang.model.element.VariableElement;
611
import javax.lang.model.type.TypeMirror;
@@ -11,7 +16,6 @@
1116

1217
public class HelperSavedValues {
1318
VariableElement encloseElement;
14-
1519
public HelperSavedValues(Element encloseElement) {
1620
this.encloseElement = (VariableElement)encloseElement;
1721
}
@@ -23,4 +27,18 @@ public TypeMirror getFieldType(){
2327
public Name getSimpleName(){
2428
return encloseElement.getSimpleName();
2529
}
30+
31+
public boolean isParcelable(){
32+
return encloseElement.getAnnotation(NeedSave.class).isParcelable();
33+
}
34+
35+
public boolean isPublic(){
36+
Set<Modifier> set = ((Element)encloseElement).getModifiers();
37+
for(Modifier modifier : set){
38+
if(modifier.equals(Modifier.PUBLIC)){
39+
return true;
40+
}
41+
}
42+
return false;
43+
}
2644
}

xqauto-processor/src/main/java/com/xqand/processor/MyProcessor.java renamed to xqauto-processor/src/main/java/com/xqand/processor/AutoSaveProcessor.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,13 @@
2626
import javax.tools.Diagnostic;
2727

2828
@AutoService(Processor.class)
29-
public class MyProcessor extends AbstractProcessor{
29+
public class AutoSaveProcessor extends AbstractProcessor{
3030

3131
private Types typeUtils;
3232
private Elements elementUtils;
3333
private Filer filer;
3434
private Messager messager;
3535

36-
3736
//存储添加了注解的Activity
3837
private Map<String, HelperClass> mHelperClassMap = new HashMap<>();
3938

@@ -63,7 +62,6 @@ public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnv
6362
for (Element annotatedElement: roundEnvironment.getElementsAnnotatedWith(NeedSave.class)) {
6463
getHelperClass(annotatedElement);
6564
}
66-
6765
for(HelperClass helperClass : mHelperClassMap.values()){
6866
try {
6967
if(helperClass.generateCode() != null){

0 commit comments

Comments
 (0)