23
23
import com .squareup .javapoet .FieldSpec ;
24
24
import com .squareup .javapoet .JavaFile ;
25
25
import com .squareup .javapoet .MethodSpec ;
26
+ import com .squareup .javapoet .TypeName ;
26
27
import com .squareup .javapoet .TypeSpec ;
27
28
import com .squareup .javapoet .TypeVariableName ;
28
29
import dagger .hilt .android .processor .internal .AndroidClassNames ;
@@ -39,6 +40,11 @@ public final class FragmentGenerator {
39
40
.addModifiers (Modifier .PRIVATE )
40
41
.build ();
41
42
43
+ private static final FieldSpec DISABLE_GET_CONTEXT_FIX_FIELD =
44
+ FieldSpec .builder (TypeName .BOOLEAN , "disableGetContextFix" )
45
+ .addModifiers (Modifier .PRIVATE )
46
+ .build ();
47
+
42
48
private final ProcessingEnvironment env ;
43
49
private final AndroidEntryPointMetadata metadata ;
44
50
private final ClassName generatedClassName ;
@@ -74,6 +80,10 @@ TypeSpec createTypeSpec() {
74
80
.addMethod (getContextMethod ())
75
81
.addMethod (inflatorMethod ());
76
82
83
+ if (useFragmentGetContextFix (env )) {
84
+ builder .addField (DISABLE_GET_CONTEXT_FIX_FIELD );
85
+ }
86
+
77
87
Generators .addGeneratedBaseClassJavadoc (builder , AndroidClassNames .ANDROID_ENTRY_POINT );
78
88
Processors .addGeneratedAnnotation (builder , env , getClass ());
79
89
Generators .copyLintAnnotations (metadata .element (), builder );
@@ -158,10 +168,12 @@ private static MethodSpec onAttachActivityMethod() {
158
168
// // Fragment's because we are getting it from base context instead of cloning from super
159
169
// // Fragment's LayoutInflater.
160
170
// componentContext = FragmentComponentManager.createContextWrapper(super.getContext(), this);
171
+ // disableGetContextFix = FragmentGetContextFix.isFragmentGetContextFixDisabled(
172
+ // super.getContext());
161
173
// }
162
174
// }
163
175
private MethodSpec initializeComponentContextMethod () {
164
- return MethodSpec .methodBuilder ("initializeComponentContext" )
176
+ MethodSpec . Builder builder = MethodSpec .methodBuilder ("initializeComponentContext" )
165
177
.addModifiers (Modifier .PRIVATE )
166
178
.beginControlFlow ("if ($N == null)" , COMPONENT_CONTEXT_FIELD )
167
179
.addComment (
@@ -171,14 +183,22 @@ private MethodSpec initializeComponentContextMethod() {
171
183
.addStatement (
172
184
"$N = $T.createContextWrapper(super.getContext(), this)" ,
173
185
COMPONENT_CONTEXT_FIELD ,
174
- metadata .componentManager ())
186
+ metadata .componentManager ());
187
+
188
+ if (useFragmentGetContextFix (env )) {
189
+ builder .addStatement ("$N = $T.isFragmentGetContextFixDisabled(super.getContext())" ,
190
+ DISABLE_GET_CONTEXT_FIX_FIELD ,
191
+ AndroidClassNames .FRAGMENT_GET_CONTEXT_FIX );
192
+ }
193
+
194
+ return builder
175
195
.endControlFlow ()
176
196
.build ();
177
197
}
178
198
179
199
// @Override
180
200
// public Context getContext() {
181
- // if (super.getContext() == null) {
201
+ // if (super.getContext() == null && !disableGetContextFix ) {
182
202
// return null;
183
203
// }
184
204
// initializeComponentContext();
@@ -191,11 +211,17 @@ private MethodSpec getContextMethod() {
191
211
.addModifiers (Modifier .PUBLIC );
192
212
193
213
if (useFragmentGetContextFix (env )) {
194
- builder .beginControlFlow ("if (super.getContext() == null)" );
214
+ builder
215
+ // Note that disableGetContext can only be true if componentContext is set, so if it is
216
+ // true we don't need to check whether componentContext is set or not.
217
+ .beginControlFlow (
218
+ "if (super.getContext() == null && !$N)" ,
219
+ DISABLE_GET_CONTEXT_FIX_FIELD );
195
220
} else {
196
- builder .beginControlFlow (
197
- "if (super.getContext() == null && $N == null)" ,
198
- COMPONENT_CONTEXT_FIELD );
221
+ builder
222
+ .beginControlFlow (
223
+ "if (super.getContext() == null && $N == null)" ,
224
+ COMPONENT_CONTEXT_FIELD );
199
225
}
200
226
201
227
return builder
0 commit comments