aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWanying Ding <wanyingd@google.com>2024-01-11 10:54:11 -0800
committerDagger Team <dagger-dev+copybara@google.com>2024-01-11 10:57:18 -0800
commit69ac5d8ea7ed8e296f83c3eb399e84814403eca8 (patch)
tree56300295ec816ed6e88a4d04dc15d372aa302f0c
parent3a75918ce39a097d420af9adaa4b92409a2b1691 (diff)
downloaddagger2-69ac5d8ea7ed8e296f83c3eb399e84814403eca8.tar.gz
Add error message if user make onCreate and onDestroy in base class final.
RELNOTES=n/a PiperOrigin-RevId: 597600148
-rw-r--r--java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java17
-rw-r--r--javatests/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGeneratorTest.java104
2 files changed, 121 insertions, 0 deletions
diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java
index 0852551da..e1bf74f50 100644
--- a/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java
+++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java
@@ -45,6 +45,7 @@ import dagger.hilt.processor.internal.Processors;
import dagger.internal.codegen.xprocessing.XElements;
import java.io.IOException;
import javax.lang.model.element.Modifier;
+import javax.tools.Diagnostic;
/** Generates an Hilt Activity class for the @AndroidEntryPoint annotated class. */
public final class ActivityGenerator {
@@ -185,6 +186,14 @@ public final class ActivityGenerator {
private MethodSpec onCreateComponentActivity() {
XMethodElement nearestOverrideMethod =
requireNearestOverrideMethod(ActivityMethod.ON_CREATE, metadata);
+ if (nearestOverrideMethod.isFinal()) {
+ env.getMessager()
+ .printMessage(
+ Diagnostic.Kind.ERROR,
+ "Do not mark onCreate as final in base Activity class, as Hilt needs to override it"
+ + " to inject SavedStateHandle.",
+ nearestOverrideMethod);
+ }
ParameterSpec.Builder parameterBuilder =
ParameterSpec.builder(AndroidClassNames.BUNDLE, "savedInstanceState");
MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("onCreate");
@@ -246,6 +255,14 @@ public final class ActivityGenerator {
private MethodSpec onDestroyComponentActivity() {
XMethodElement nearestOverrideMethod =
requireNearestOverrideMethod(ActivityMethod.ON_DESTROY, metadata);
+ if (nearestOverrideMethod.isFinal()) {
+ env.getMessager()
+ .printMessage(
+ Diagnostic.Kind.ERROR,
+ "Do not mark onDestroy as final in base Activity class, as Hilt needs to override it"
+ + " to clean up SavedStateHandle.",
+ nearestOverrideMethod);
+ }
return MethodSpec.methodBuilder("onDestroy")
.addAnnotation(Override.class)
.addModifiers(XElements.getModifiers(nearestOverrideMethod))
diff --git a/javatests/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGeneratorTest.java b/javatests/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGeneratorTest.java
index b58c355c8..a056670d7 100644
--- a/javatests/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGeneratorTest.java
+++ b/javatests/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGeneratorTest.java
@@ -71,4 +71,108 @@ public class ActivityGeneratorTest {
HiltCompilerTests.hiltCompiler(baseActivity, myActivity)
.compile(subject -> subject.hasErrorCount(0));
}
+
+ @Test
+ public void baseActivityHasFinalOnDestroy_fails() {
+ Source myActivity =
+ HiltCompilerTests.javaSource(
+ "test.MyActivity",
+ "package test;",
+ "",
+ "import dagger.hilt.android.AndroidEntryPoint;",
+ "",
+ "@AndroidEntryPoint(BaseActivity.class)",
+ "public class MyActivity extends Hilt_MyActivity {}");
+ Source baseActivity =
+ HiltCompilerTests.javaSource(
+ "test.BaseActivity",
+ "package test;",
+ "",
+ "import androidx.activity.ComponentActivity;",
+ "",
+ "public class BaseActivity extends ComponentActivity {",
+ " @Override public final void onDestroy() {}",
+ "}");
+ HiltCompilerTests.hiltCompiler(myActivity, baseActivity)
+ .compile(
+ subject -> {
+ // TODO(b/319663779) make error count consistent.
+ // subject.hasErrorCount(1);
+ subject.hasErrorContaining(
+ "Do not mark onDestroy as final in base Activity class, as Hilt needs to override"
+ + " it to clean up SavedStateHandle");
+ });
+ }
+
+ @Test
+ public void baseActivityHasFinalOnCreate_fails() {
+ Source myActivity =
+ HiltCompilerTests.javaSource(
+ "test.MyActivity",
+ "package test;",
+ "",
+ "import dagger.hilt.android.AndroidEntryPoint;",
+ "",
+ "@AndroidEntryPoint(BaseActivity.class)",
+ "public class MyActivity extends Hilt_MyActivity {}");
+ Source baseActivity =
+ HiltCompilerTests.javaSource(
+ "test.BaseActivity",
+ "package test;",
+ "",
+ "import android.os.Bundle;",
+ "import androidx.activity.ComponentActivity;",
+ "",
+ "public class BaseActivity extends ComponentActivity {",
+ " @Override public final void onCreate(Bundle bundle) {}",
+ "}");
+ HiltCompilerTests.hiltCompiler(myActivity, baseActivity)
+ .compile(
+ subject -> {
+ // TODO(b/319663779) make error count consistent.
+ // subject.hasErrorCount(1);
+ subject.hasErrorContaining(
+ "Do not mark onCreate as final in base Activity class, as Hilt needs to override"
+ + " it to inject SavedStateHandle");
+ });
+ }
+
+ @Test
+ public void secondBaseActivityHasFinalOnCreate_fails() {
+ Source myActivity =
+ HiltCompilerTests.javaSource(
+ "test.MyActivity",
+ "package test;",
+ "",
+ "import dagger.hilt.android.AndroidEntryPoint;",
+ "",
+ "@AndroidEntryPoint(BaseActivity.class)",
+ "public class MyActivity extends Hilt_MyActivity {}");
+ Source baseActivity =
+ HiltCompilerTests.javaSource(
+ "test.BaseActivity",
+ "package test;",
+ "",
+ "public class BaseActivity extends BaseActivity2 {}");
+ Source baseActivity2 =
+ HiltCompilerTests.javaSource(
+ "test.BaseActivity2",
+ "package test;",
+ "",
+ "import android.os.Bundle;",
+ "import androidx.activity.ComponentActivity;",
+ "",
+ "public class BaseActivity2 extends ComponentActivity {",
+ " @Override public final void onCreate(Bundle bundle) {}",
+ "}");
+ HiltCompilerTests.hiltCompiler(myActivity, baseActivity, baseActivity2)
+ .compile(
+ subject -> {
+ // TODO(b/319663779) make error count consistent.
+ // subject.hasErrorCount(1);
+ subject.hasErrorContaining(
+ "Do not mark onCreate as final in base Activity class, as Hilt needs to override"
+ + " it to inject SavedStateHandle");
+ });
+ }
}