Merge "Change @DialerComponent to @IncludeInDialerRoot and turn on @IncludeInDialerRoot in root component generator."
diff --git a/java/com/android/dialer/rootcomponentgenerator/annotation/DialerComponent.java b/java/com/android/dialer/rootcomponentgenerator/annotation/IncludeInDialerRoot.java
similarity index 62%
rename from java/com/android/dialer/rootcomponentgenerator/annotation/DialerComponent.java
rename to java/com/android/dialer/rootcomponentgenerator/annotation/IncludeInDialerRoot.java
index 573abae..4ce9ec3 100644
--- a/java/com/android/dialer/rootcomponentgenerator/annotation/DialerComponent.java
+++ b/java/com/android/dialer/rootcomponentgenerator/annotation/IncludeInDialerRoot.java
@@ -20,26 +20,28 @@
 import java.lang.annotation.Target;
 
 /**
- * Annotates a type equivalent to {@link dagger.Subcomponent}.
+ * Annotates a type that should be included in Dialer Root Component. Typically, annotated types are
+ * HasComponent interfaces.
  *
- * <p>The annotation processor will generate a new type file with some prefix, which contains public
- * static XXX get(Context context) method and HasComponent interface like:
- *
- * <p>
+ * <p>An example:
  *
  * <pre>
  * <code>
- *  public static SimulatorComponent get(Context context) {
- *      HasRootComponent hasRootComponent = (HasRootComponent) context.getApplicationContext();
- *      return ((HasComponent)(hasRootComponent.component()).simulatorComponent();
- *  }
- *  public interface HasComponent {
+ * {@literal @}dagger.Subcomponent
+ * public abstract class SimulatorComponent {
+ *   public static SimulatorComponent get(Context context) {
+ *      return ((HasComponent)((HasRootComponent) context.getApplicationContext()).component())
+ *         .simulatorComponent();
+ *   }
+ *   {@literal @}IncludeInDialerRoot
+ *   public interface HasComponent {
  *      SimulatorComponent simulatorComponent();
  *  }
+ * }
  * </code>
  * </pre>
  */
 @Target(ElementType.TYPE)
-public @interface DialerComponent {
+public @interface IncludeInDialerRoot {
   Class<?>[] modules() default {};
 }
diff --git a/java/com/android/dialer/rootcomponentgenerator/processor/ComponentGeneratingStep.java b/java/com/android/dialer/rootcomponentgenerator/processor/ComponentGeneratingStep.java
index 8605499..04d42ac 100644
--- a/java/com/android/dialer/rootcomponentgenerator/processor/ComponentGeneratingStep.java
+++ b/java/com/android/dialer/rootcomponentgenerator/processor/ComponentGeneratingStep.java
@@ -23,7 +23,7 @@
 import static javax.lang.model.element.Modifier.STATIC;
 import static javax.lang.model.util.ElementFilter.typesIn;
 
-import com.android.dialer.rootcomponentgenerator.annotation.DialerComponent;
+import com.android.dialer.rootcomponentgenerator.annotation.IncludeInDialerRoot;
 import com.google.auto.common.BasicAnnotationProcessor.ProcessingStep;
 import com.google.auto.common.MoreElements;
 import com.google.common.base.Optional;
@@ -52,7 +52,7 @@
 import javax.lang.model.type.TypeMirror;
 
 /**
- * Generates component for a type annotated with {@link DialerComponent}.
+ * Generates component for a type annotated with {@link IncludeInDialerRoot}.
  *
  * <p>Our components have boilerplate code like:
  *
@@ -67,6 +67,7 @@
  *      return ((HasComponent)((HasRootComponent) context.getApplicationContext()).component())
  *         .simulatorComponent();
  *   }
+ *   {@literal @}IncludeInDialerRoot
  *   public interface HasComponent {
  *      SimulatorComponent simulatorComponent();
  *  }
@@ -88,13 +89,13 @@
 
   @Override
   public Set<? extends Class<? extends Annotation>> annotations() {
-    return ImmutableSet.of(DialerComponent.class);
+    return ImmutableSet.of(IncludeInDialerRoot.class);
   }
 
   @Override
   public Set<? extends Element> process(
       SetMultimap<Class<? extends Annotation>, Element> elementsByAnnotation) {
-    for (TypeElement type : typesIn(elementsByAnnotation.get(DialerComponent.class))) {
+    for (TypeElement type : typesIn(elementsByAnnotation.get(IncludeInDialerRoot.class))) {
       generateComponent(type);
     }
     return Collections.emptySet();
@@ -124,7 +125,7 @@
   private AnnotationSpec makeDaggerSubcomponentAnnotation(TypeElement dialerComponentElement) {
 
     Optional<AnnotationMirror> componentMirror =
-        getAnnotationMirror(dialerComponentElement, DialerComponent.class);
+        getAnnotationMirror(dialerComponentElement, IncludeInDialerRoot.class);
 
     AnnotationSpec.Builder subcomponentBuilder = AnnotationSpec.builder(Subcomponent.class);
     for (AnnotationValue annotationValue :
diff --git a/java/com/android/dialer/rootcomponentgenerator/processor/MetadataGeneratingStep.java b/java/com/android/dialer/rootcomponentgenerator/processor/MetadataGeneratingStep.java
index b7d31c0..3b46ed0 100644
--- a/java/com/android/dialer/rootcomponentgenerator/processor/MetadataGeneratingStep.java
+++ b/java/com/android/dialer/rootcomponentgenerator/processor/MetadataGeneratingStep.java
@@ -18,22 +18,25 @@
 
 import static javax.tools.Diagnostic.Kind.ERROR;
 
+import com.android.dialer.rootcomponentgenerator.annotation.IncludeInDialerRoot;
 import com.android.dialer.rootcomponentgenerator.annotation.InstallIn;
 import com.android.dialer.rootcomponentgenerator.annotation.RootComponentGeneratorMetadata;
 import com.google.auto.common.BasicAnnotationProcessor.ProcessingStep;
+import com.google.auto.common.MoreElements;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.SetMultimap;
 import com.squareup.javapoet.AnnotationSpec;
 import com.squareup.javapoet.TypeSpec;
-import dagger.Subcomponent;
 import java.lang.annotation.Annotation;
 import java.util.Collections;
 import java.util.Set;
 import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.element.Element;
+import javax.lang.model.element.TypeElement;
 
 /**
- * Genereates metadata for every type annotated by {@link InstallIn} and {@link Subcomponent}.
+ * Genereates metadata for every type annotated by {@link InstallIn} and {@link
+ * IncludeInDialerRoot}.
  *
  * <p>The metadata has the information where the annotated types are and it is used by annotation
  * processor when the processor tries to generate root component.
@@ -48,15 +51,15 @@
 
   @Override
   public Set<? extends Class<? extends Annotation>> annotations() {
-    return ImmutableSet.of(Subcomponent.class, InstallIn.class);
+    return ImmutableSet.of(IncludeInDialerRoot.class, InstallIn.class);
   }
 
   @Override
   public Set<? extends Element> process(
       SetMultimap<Class<? extends Annotation>, Element> elementsByAnnotation) {
 
-    for (Element element : elementsByAnnotation.get(Subcomponent.class)) {
-      generateMetadataFor(Subcomponent.class, element);
+    for (Element element : elementsByAnnotation.get(IncludeInDialerRoot.class)) {
+      generateMetadataFor(IncludeInDialerRoot.class, MoreElements.asType(element));
     }
     for (Element element : elementsByAnnotation.get(InstallIn.class)) {
       if (element.getAnnotation(InstallIn.class).variants().length == 0) {
@@ -66,16 +69,17 @@
                 ERROR, String.format("@InstallIn %s must have at least one variant", element));
         continue;
       }
-      generateMetadataFor(InstallIn.class, element);
+      generateMetadataFor(InstallIn.class, MoreElements.asType(element));
     }
 
     return Collections.emptySet();
   }
 
   private void generateMetadataFor(
-      Class<? extends Annotation> annotation, Element annotatedElement) {
+      Class<? extends Annotation> annotation, TypeElement annotatedElement) {
     TypeSpec.Builder metadataClassBuilder =
-        TypeSpec.classBuilder(annotatedElement.getSimpleName() + "Metadata");
+        TypeSpec.classBuilder(
+            annotatedElement.getQualifiedName().toString().replace('.', '_') + "Metadata");
     metadataClassBuilder.addAnnotation(
         AnnotationSpec.builder(RootComponentGeneratorMetadata.class)
             .addMember("tag", "$S", annotation.getSimpleName())
diff --git a/java/com/android/dialer/rootcomponentgenerator/processor/RootComponentGeneratingStep.java b/java/com/android/dialer/rootcomponentgenerator/processor/RootComponentGeneratingStep.java
index 9b97ada..ad91a3c 100644
--- a/java/com/android/dialer/rootcomponentgenerator/processor/RootComponentGeneratingStep.java
+++ b/java/com/android/dialer/rootcomponentgenerator/processor/RootComponentGeneratingStep.java
@@ -22,6 +22,7 @@
 
 import com.android.dialer.rootcomponentgenerator.annotation.DialerRootComponent;
 import com.android.dialer.rootcomponentgenerator.annotation.DialerVariant;
+import com.android.dialer.rootcomponentgenerator.annotation.IncludeInDialerRoot;
 import com.android.dialer.rootcomponentgenerator.annotation.InstallIn;
 import com.android.dialer.rootcomponentgenerator.annotation.RootComponentGeneratorMetadata;
 import com.google.auto.common.BasicAnnotationProcessor.ProcessingStep;
@@ -35,7 +36,6 @@
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.TypeSpec;
 import dagger.Component;
-import dagger.Subcomponent;
 import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -89,8 +89,7 @@
             .addModifiers(Modifier.PUBLIC)
             .addAnnotation(Singleton.class);
     for (TypeElement componentWithSuperInterface : componentList) {
-      rootComponentClassBuilder.addSuperinterface(
-          ClassName.get(componentWithSuperInterface).nestedClass("HasComponent"));
+      rootComponentClassBuilder.addSuperinterface(ClassName.get(componentWithSuperInterface));
     }
     AnnotationSpec.Builder componentAnnotation = AnnotationSpec.builder(Component.class);
     for (TypeElement annotatedElement : componentModuleMap.get(dialerVariant)) {
@@ -104,7 +103,7 @@
 
   private List<TypeElement> generateComponentList() {
     List<TypeElement> list = new ArrayList<>();
-    extractInfoFromMetadata(Subcomponent.class, list::add);
+    extractInfoFromMetadata(IncludeInDialerRoot.class, list::add);
     return list;
   }