Skip to content

Commit 9ae4af3

Browse files
bcorsoDagger Team
authored andcommitted
Fix ActivityGenerator's logic for onCreate modifiers..
This CL fixes an issue with ActivityGenerator which was looking for modifiers on the `@AndroidEntryPoint`-annotated class's `onCreate` method rather than the super class method. See b/418908653 for details. I've also had to update a few places where we were missing the `@Nullable` annotation due to the same bug. RELNOTES=N/A PiperOrigin-RevId: 761597753
1 parent bbaf671 commit 9ae4af3

File tree

1 file changed

+27
-25
lines changed

1 file changed

+27
-25
lines changed

hilt-compiler/main/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package dagger.hilt.android.processor.internal.androidentrypoint;
1818

1919
import static com.google.common.base.Preconditions.checkState;
20+
import static dagger.internal.codegen.extension.DaggerCollectors.toOptional;
2021
import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList;
2122
import static kotlin.streams.jdk8.StreamsKt.asStream;
2223

@@ -44,6 +45,7 @@
4445
import dagger.hilt.processor.internal.Processors;
4546
import dagger.internal.codegen.xprocessing.XElements;
4647
import java.io.IOException;
48+
import java.util.Optional;
4749
import javax.lang.model.element.Modifier;
4850
import javax.tools.Diagnostic;
4951

@@ -185,31 +187,33 @@ private MethodSpec getDefaultViewModelProviderFactory() {
185187
// }
186188
//
187189
private MethodSpec onCreateComponentActivity() {
188-
XMethodElement nearestOverrideMethod =
189-
requireNearestOverrideMethod(ActivityMethod.ON_CREATE, metadata);
190-
if (nearestOverrideMethod.isFinal()) {
190+
XMethodElement nearestSuperClassMethod =
191+
nearestSuperClassMethod(ActivityMethod.ON_CREATE, metadata);
192+
if (nearestSuperClassMethod.isFinal()) {
191193
env.getMessager()
192194
.printMessage(
193195
Diagnostic.Kind.ERROR,
194196
"Do not mark onCreate as final in base Activity class, as Hilt needs to override it"
195197
+ " to inject SavedStateHandle.",
196-
nearestOverrideMethod);
198+
nearestSuperClassMethod);
197199
}
198200
ParameterSpec.Builder parameterBuilder =
199201
ParameterSpec.builder(AndroidClassNames.BUNDLE, "savedInstanceState");
200202
MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("onCreate");
201-
// If the sub class is overriding onCreate with @Nullable parameter, then this generated
202-
// method will also prefix the parameter with @Nullable.
203-
if (isNullable(nearestOverrideMethod.getParameters().get(0))) {
203+
if (isNullable(nearestSuperClassMethod.getParameters().get(0))) {
204204
parameterBuilder.addAnnotation(AndroidClassNames.NULLABLE);
205205
}
206-
if (nearestOverrideMethod.hasAnnotation(AndroidClassNames.UI_THREAD)) {
207-
methodBuilder.addAnnotation(AndroidClassNames.UI_THREAD);
208-
}
206+
androidEntryPointMethod(ActivityMethod.ON_CREATE, metadata)
207+
.ifPresent(
208+
method -> {
209+
if (method.hasAnnotation(AndroidClassNames.UI_THREAD)) {
210+
methodBuilder.addAnnotation(AndroidClassNames.UI_THREAD);
211+
}
212+
});
209213
return methodBuilder
210214
.addAnnotation(AndroidClassNames.CALL_SUPER)
211215
.addAnnotation(Override.class)
212-
.addModifiers(XElements.getModifiers(nearestOverrideMethod))
216+
.addModifiers(XElements.getModifiers(nearestSuperClassMethod))
213217
.addParameter(parameterBuilder.build())
214218
.addStatement("super.onCreate(savedInstanceState)")
215219
.addStatement("initSavedStateHandleHolder()")
@@ -254,37 +258,35 @@ private static boolean hasNullableAnnotation(XAnnotated element) {
254258
// }
255259
// }
256260
private MethodSpec onDestroyComponentActivity() {
257-
XMethodElement nearestOverrideMethod =
258-
requireNearestOverrideMethod(ActivityMethod.ON_DESTROY, metadata);
259-
if (nearestOverrideMethod.isFinal()) {
261+
XMethodElement nearestSuperClassMethod =
262+
nearestSuperClassMethod(ActivityMethod.ON_DESTROY, metadata);
263+
if (nearestSuperClassMethod.isFinal()) {
260264
env.getMessager()
261265
.printMessage(
262266
Diagnostic.Kind.ERROR,
263267
"Do not mark onDestroy as final in base Activity class, as Hilt needs to override it"
264268
+ " to clean up SavedStateHandle.",
265-
nearestOverrideMethod);
269+
nearestSuperClassMethod);
266270
}
267271
return MethodSpec.methodBuilder("onDestroy")
268272
.addAnnotation(Override.class)
269-
.addModifiers(XElements.getModifiers(nearestOverrideMethod))
273+
.addModifiers(XElements.getModifiers(nearestSuperClassMethod))
270274
.addStatement("super.onDestroy()")
271275
.beginControlFlow("if ($N != null)", SAVED_STATE_HANDLE_HOLDER_FIELD)
272276
.addStatement("$N.clear()", SAVED_STATE_HANDLE_HOLDER_FIELD)
273277
.endControlFlow()
274278
.build();
275279
}
276280

277-
private static XMethodElement requireNearestOverrideMethod(
281+
private static Optional<XMethodElement> androidEntryPointMethod(
278282
ActivityMethod activityMethod, AndroidEntryPointMetadata metadata) {
279-
XMethodElement methodOnAndroidEntryPointElement =
280-
metadata.element().getDeclaredMethods().stream()
281-
.filter(method -> MethodSignature.of(method).equals(activityMethod.signature))
282-
.findFirst()
283-
.orElse(null);
284-
if (methodOnAndroidEntryPointElement != null) {
285-
return methodOnAndroidEntryPointElement;
286-
}
283+
return metadata.element().getDeclaredMethods().stream()
284+
.filter(method -> MethodSignature.of(method).equals(activityMethod.signature))
285+
.collect(toOptional());
286+
}
287287

288+
private static XMethodElement nearestSuperClassMethod(
289+
ActivityMethod activityMethod, AndroidEntryPointMetadata metadata) {
288290
ImmutableList<XMethodElement> methodOnBaseElement =
289291
asStream(metadata.baseElement().getAllMethods())
290292
.filter(method -> MethodSignature.of(method).equals(activityMethod.signature))

0 commit comments

Comments
 (0)