diff --git a/java/dagger/hilt/android/BUILD b/java/dagger/hilt/android/BUILD index abbdbc7b150..b30f6625dd3 100644 --- a/java/dagger/hilt/android/BUILD +++ b/java/dagger/hilt/android/BUILD @@ -262,7 +262,6 @@ gen_maven_artifact( proguard_and_r8_specs = [ "//java/dagger/hilt:proguard-rules.pro", "//java/dagger/hilt/android:proguard-rules.pro", - "//java/dagger/hilt/android/lifecycle:proguard-rules.pro", "//java/dagger/hilt/internal:proguard-rules.pro", ], ) diff --git a/java/dagger/hilt/android/internal/lifecycle/HiltViewModelFactory.java b/java/dagger/hilt/android/internal/lifecycle/HiltViewModelFactory.java index 33b1618031d..f3c085cdbe4 100644 --- a/java/dagger/hilt/android/internal/lifecycle/HiltViewModelFactory.java +++ b/java/dagger/hilt/android/internal/lifecycle/HiltViewModelFactory.java @@ -55,11 +55,11 @@ public final class HiltViewModelFactory implements ViewModelProvider.Factory { @InstallIn(ViewModelComponent.class) public interface ViewModelFactoriesEntryPoint { @HiltViewModelMap - Map> getHiltViewModelMap(); + Map, Provider> getHiltViewModelMap(); // From ViewModel class names to user defined @AssistedFactory-annotated implementations. @HiltViewModelAssistedMap - Map getHiltViewModelAssistedMap(); + Map, Object> getHiltViewModelAssistedMap(); } /** Creation extra key for the callbacks that create @AssistedInject-annotated ViewModels. */ @@ -72,11 +72,11 @@ public interface ViewModelFactoriesEntryPoint { interface ViewModelModule { @Multibinds @HiltViewModelMap - Map hiltViewModelMap(); + Map, ViewModel> hiltViewModelMap(); @Multibinds @HiltViewModelAssistedMap - Map hiltViewModelAssistedMap(); + Map, Object> hiltViewModelAssistedMap(); } private final Set hiltViewModelKeys; @@ -113,12 +113,12 @@ private T createViewModel( Provider provider = EntryPoints.get(component, ViewModelFactoriesEntryPoint.class) .getHiltViewModelMap() - .get(modelClass.getName()); + .get(modelClass); Function1 creationCallback = extras.get(CREATION_CALLBACK_KEY); Object assistedFactory = EntryPoints.get(component, ViewModelFactoriesEntryPoint.class) .getHiltViewModelAssistedMap() - .get(modelClass.getName()); + .get(modelClass); if (assistedFactory == null) { if (creationCallback == null) { diff --git a/java/dagger/hilt/android/lifecycle/BUILD b/java/dagger/hilt/android/lifecycle/BUILD index 4452c35a908..26394f0f8b4 100644 --- a/java/dagger/hilt/android/lifecycle/BUILD +++ b/java/dagger/hilt/android/lifecycle/BUILD @@ -33,7 +33,6 @@ android_library( exported_plugins = [ "//java/dagger/hilt/android/processor/internal/viewmodel:processor", ], - proguard_specs = ["proguard-rules.pro"], exports = [ "//:dagger_with_compiler", "//java/dagger/hilt:install_in", diff --git a/java/dagger/hilt/android/lifecycle/proguard-rules.pro b/java/dagger/hilt/android/lifecycle/proguard-rules.pro deleted file mode 100644 index 6c647f10532..00000000000 --- a/java/dagger/hilt/android/lifecycle/proguard-rules.pro +++ /dev/null @@ -1,2 +0,0 @@ -# Keep class names of Hilt injected ViewModels since their name are used as a multibinding map key. --keepnames @dagger.hilt.android.lifecycle.HiltViewModel class * extends androidx.lifecycle.ViewModel \ No newline at end of file diff --git a/java/dagger/hilt/android/processor/internal/viewmodel/ViewModelModuleGenerator.kt b/java/dagger/hilt/android/processor/internal/viewmodel/ViewModelModuleGenerator.kt index e7b3dad2f2f..e75fa4346e3 100644 --- a/java/dagger/hilt/android/processor/internal/viewmodel/ViewModelModuleGenerator.kt +++ b/java/dagger/hilt/android/processor/internal/viewmodel/ViewModelModuleGenerator.kt @@ -22,6 +22,7 @@ import androidx.room.compiler.processing.XProcessingEnv import androidx.room.compiler.processing.addOriginatingElement import com.squareup.javapoet.AnnotationSpec import com.squareup.javapoet.ClassName +import com.squareup.javapoet.FieldSpec import com.squareup.javapoet.JavaFile import com.squareup.javapoet.MethodSpec import com.squareup.javapoet.TypeName @@ -42,18 +43,19 @@ import javax.lang.model.element.Modifier * public static abstract class BindsModule { * @Binds * @IntoMap - * @StringKey("pkg.$") + * @LazyClassKey(pkg.$) * @HiltViewModelMap * public abstract ViewModel bind($ vm) * } * @Module * @InstallIn(ActivityRetainedComponent.class) * public static final class KeyModule { + * private static String className = "pkg.$"; * @Provides * @IntoSet * @HiltViewModelMap.KeySet * public static String provide() { - * return "pkg.$"; + * return className; * } * } * } @@ -62,7 +64,7 @@ import javax.lang.model.element.Modifier @OptIn(ExperimentalProcessingApi::class) internal class ViewModelModuleGenerator( private val processingEnv: XProcessingEnv, - private val viewModelMetadata: ViewModelMetadata + private val viewModelMetadata: ViewModelMetadata, ) { fun generate() { val modulesTypeSpec = @@ -75,7 +77,7 @@ internal class ViewModelModuleGenerator( .addMember( "topLevelClass", "$T.class", - viewModelMetadata.className.topLevelClassName() + viewModelMetadata.className.topLevelClassName(), ) .build() ) @@ -94,7 +96,7 @@ internal class ViewModelModuleGenerator( private fun getBindsModuleTypeSpec() = createModuleTypeSpec( className = "BindsModule", - component = AndroidClassNames.VIEW_MODEL_COMPONENT + component = AndroidClassNames.VIEW_MODEL_COMPONENT, ) .addModifiers(Modifier.ABSTRACT) .addMethod(MethodSpec.constructorBuilder().addModifiers(Modifier.PRIVATE).build()) @@ -112,8 +114,8 @@ internal class ViewModelModuleGenerator( .addAnnotation(ClassNames.BINDS) .addAnnotation(ClassNames.INTO_MAP) .addAnnotation( - AnnotationSpec.builder(ClassNames.STRING_KEY) - .addMember("value", S, viewModelMetadata.className.reflectionName()) + AnnotationSpec.builder(ClassNames.LAZY_CLASS_KEY) + .addMember("value", "$T.class", viewModelMetadata.className) .build() ) .addAnnotation(AndroidClassNames.HILT_VIEW_MODEL_MAP_QUALIFIER) @@ -125,11 +127,17 @@ internal class ViewModelModuleGenerator( private fun getKeyModuleTypeSpec() = createModuleTypeSpec( className = "KeyModule", - component = AndroidClassNames.ACTIVITY_RETAINED_COMPONENT + component = AndroidClassNames.ACTIVITY_RETAINED_COMPONENT, ) .addModifiers(Modifier.FINAL) + .addAnnotation(ClassNames.IDENTIFIER_NAME_STRING) .addMethod(MethodSpec.constructorBuilder().addModifiers(Modifier.PRIVATE).build()) .addMethod(getViewModelKeyProvidesMethod()) + .addField( + FieldSpec.builder(String::class.java, "className", Modifier.PRIVATE, Modifier.STATIC) + .initializer(S, viewModelMetadata.className.reflectionName()) + .build() + ) .build() private fun getViewModelKeyProvidesMethod() = @@ -139,7 +147,7 @@ internal class ViewModelModuleGenerator( .addAnnotation(AndroidClassNames.HILT_VIEW_MODEL_KEYS_QUALIFIER) .addModifiers(Modifier.PUBLIC, Modifier.STATIC) .returns(String::class.java) - .addStatement("return $S", viewModelMetadata.className.reflectionName()) + .addStatement("return className") .build() /** @@ -147,7 +155,7 @@ internal class ViewModelModuleGenerator( * ``` * @Binds * @IntoMap - * @StringKey("pkg.FooViewModel") + * @LazyClassKey(pkg.FooViewModel.class) * @HiltViewModelAssistedMap * public abstract Object bind(FooViewModelAssistedFactory factory); * ``` @@ -160,8 +168,8 @@ internal class ViewModelModuleGenerator( .addAnnotation(ClassNames.BINDS) .addAnnotation(ClassNames.INTO_MAP) .addAnnotation( - AnnotationSpec.builder(ClassNames.STRING_KEY) - .addMember("value", S, viewModelMetadata.className.reflectionName()) + AnnotationSpec.builder(ClassNames.LAZY_CLASS_KEY) + .addMember("value", "$T.class", viewModelMetadata.className) .build() ) .addAnnotation(AndroidClassNames.HILT_VIEW_MODEL_ASSISTED_FACTORY_MAP_QUALIFIER) diff --git a/java/dagger/hilt/processor/internal/ClassNames.java b/java/dagger/hilt/processor/internal/ClassNames.java index bc0591cb0ff..9a1566805ae 100644 --- a/java/dagger/hilt/processor/internal/ClassNames.java +++ b/java/dagger/hilt/processor/internal/ClassNames.java @@ -72,6 +72,9 @@ public final class ClassNames { public static final ClassName DEFINE_COMPONENT_CLASSES = get("dagger.hilt.internal.definecomponent", "DefineComponentClasses"); + public static final ClassName IDENTIFIER_NAME_STRING = + get("dagger.internal", "IdentifierNameString"); + public static final ClassName ASSISTED_INJECT = get("dagger.assisted", "AssistedInject"); public static final ClassName ASSISTED_FACTORY = get("dagger.assisted", "AssistedFactory"); public static final ClassName BINDS = @@ -86,6 +89,7 @@ public final class ClassNames { public static final ClassName INTO_SET = get("dagger.multibindings", "IntoSet"); public static final ClassName ELEMENTS_INTO_SET = get("dagger.multibindings", "ElementsIntoSet"); public static final ClassName STRING_KEY = get("dagger.multibindings", "StringKey"); + public static final ClassName LAZY_CLASS_KEY = get("dagger.multibindings", "LazyClassKey"); public static final ClassName PROVIDES = get("dagger", "Provides"); public static final ClassName COMPONENT = get("dagger", "Component"); diff --git a/java/dagger/internal/IdentifierNameString.java b/java/dagger/internal/IdentifierNameString.java index 7d4b1d9e45e..95d2bfa6fa8 100644 --- a/java/dagger/internal/IdentifierNameString.java +++ b/java/dagger/internal/IdentifierNameString.java @@ -26,8 +26,9 @@ /** * Annotates the dagger generated class that requires applying -identifiernamestring rule. * - *

When applied, all the strings that corresponds to a class name within the annotated class will - * be obfuscated if its corresponding class is obfuscated. This only works with r8. This annotation + *

When applied, all the strings fields that corresponds to a class name within the annotated + * class will be obfuscated if its corresponding class is obfuscated. This only works with r8. + * */ @Documented @Retention(CLASS)