• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Dagger Authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package dagger.android.support.functional;
18 
19 import dagger.Binds;
20 import dagger.Component;
21 import dagger.Module;
22 import dagger.Provides;
23 import dagger.Subcomponent;
24 import dagger.android.AndroidInjectionModule;
25 import dagger.android.AndroidInjector;
26 import dagger.android.support.DaggerApplication;
27 import dagger.android.support.functional.ComponentStructureFollowsControllerStructureApplication.ApplicationComponent.BroadcastReceiverSubcomponent.BroadcastReceiverModule;
28 import dagger.android.support.functional.ComponentStructureFollowsControllerStructureApplication.ApplicationComponent.ContentProviderSubcomponent.ContentProviderModule;
29 import dagger.android.support.functional.ComponentStructureFollowsControllerStructureApplication.ApplicationComponent.InnerActivitySubcomponent.InnerActivityModule;
30 import dagger.android.support.functional.ComponentStructureFollowsControllerStructureApplication.ApplicationComponent.IntentServiceSubcomponent.IntentServiceModule;
31 import dagger.android.support.functional.ComponentStructureFollowsControllerStructureApplication.ApplicationComponent.ServiceSubcomponent.ServiceModule;
32 import dagger.multibindings.ClassKey;
33 import dagger.multibindings.IntoMap;
34 import dagger.multibindings.IntoSet;
35 
36 public final class ComponentStructureFollowsControllerStructureApplication
37     extends DaggerApplication {
38 
39   @Override
applicationInjector()40   protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
41     return DaggerComponentStructureFollowsControllerStructureApplication_ApplicationComponent
42         .create();
43   }
44 
45   @Component(modules = {ApplicationComponent.ApplicationModule.class, AndroidInjectionModule.class})
46   interface ApplicationComponent
47       extends AndroidInjector<ComponentStructureFollowsControllerStructureApplication> {
48     @Module(
49       subcomponents = {
50         ActivitySubcomponent.class,
51         InnerActivitySubcomponent.class,
52         ServiceSubcomponent.class,
53         IntentServiceSubcomponent.class,
54         BroadcastReceiverSubcomponent.class,
55         ContentProviderSubcomponent.class,
56       }
57     )
58     abstract class ApplicationModule {
59       @Provides
60       @IntoSet
addToComponentHierarchy()61       static Class<?> addToComponentHierarchy() {
62         return ApplicationComponent.class;
63       }
64 
65       @Binds
66       @IntoMap
67       @ClassKey(TestActivity.class)
bindFactoryForTestActivity( ActivitySubcomponent.Builder builder)68       abstract AndroidInjector.Factory<?> bindFactoryForTestActivity(
69           ActivitySubcomponent.Builder builder);
70 
71       @Binds
72       @IntoMap
73       @ClassKey(OuterClass.TestInnerClassActivity.class)
bindFactoryForInnerActivity( InnerActivitySubcomponent.Builder builder)74       abstract AndroidInjector.Factory<?> bindFactoryForInnerActivity(
75           InnerActivitySubcomponent.Builder builder);
76 
77       @Binds
78       @IntoMap
79       @ClassKey(TestService.class)
bindFactoryForService( ServiceSubcomponent.Builder builder)80       abstract AndroidInjector.Factory<?> bindFactoryForService(
81           ServiceSubcomponent.Builder builder);
82 
83       @Binds
84       @IntoMap
85       @ClassKey(TestIntentService.class)
bindFactoryForIntentService( IntentServiceSubcomponent.Builder builder)86       abstract AndroidInjector.Factory<?> bindFactoryForIntentService(
87           IntentServiceSubcomponent.Builder builder);
88 
89       @Binds
90       @IntoMap
91       @ClassKey(TestBroadcastReceiver.class)
bindFactoryForBroadcastReceiver( BroadcastReceiverSubcomponent.Builder builder)92       abstract AndroidInjector.Factory<?> bindFactoryForBroadcastReceiver(
93           BroadcastReceiverSubcomponent.Builder builder);
94 
95       @Binds
96       @IntoMap
97       @ClassKey(TestContentProvider.class)
bindFactoryForContentProvider( ContentProviderSubcomponent.Builder builder)98       abstract AndroidInjector.Factory<?> bindFactoryForContentProvider(
99           ContentProviderSubcomponent.Builder builder);
100     }
101 
102     @Subcomponent(modules = ActivitySubcomponent.ActivityModule.class)
103     interface ActivitySubcomponent extends AndroidInjector<TestActivity> {
104       @Module(subcomponents = {ParentFragmentSubcomponent.class, DialogFragmentSubcomponent.class})
105       abstract class ActivityModule {
106         @Provides
107         @IntoSet
addToComponentHierarchy()108         static Class<?> addToComponentHierarchy() {
109           return ActivitySubcomponent.class;
110         }
111 
112         @Binds
113         @IntoMap
114         @ClassKey(TestParentFragment.class)
bindFactoryForParentFragment( ParentFragmentSubcomponent.Builder builder)115         abstract AndroidInjector.Factory<?> bindFactoryForParentFragment(
116             ParentFragmentSubcomponent.Builder builder);
117 
118         @Binds
119         @IntoMap
120         @ClassKey(TestDialogFragment.class)
bindFactoryForDialogFragment( DialogFragmentSubcomponent.Builder builder)121         abstract AndroidInjector.Factory<?> bindFactoryForDialogFragment(
122             DialogFragmentSubcomponent.Builder builder);
123       }
124 
125       @Subcomponent.Builder
126       abstract class Builder extends AndroidInjector.Builder<TestActivity> {}
127 
128       @Subcomponent(modules = ParentFragmentSubcomponent.ParentFragmentModule.class)
129       interface ParentFragmentSubcomponent extends AndroidInjector<TestParentFragment> {
130         @Module(subcomponents = ChildFragmentSubcomponent.class)
131         abstract class ParentFragmentModule {
132           @Provides
133           @IntoSet
addToComponentHierarchy()134           static Class<?> addToComponentHierarchy() {
135             return ParentFragmentSubcomponent.class;
136           }
137 
138           @Binds
139           @IntoMap
140           @ClassKey(TestChildFragment.class)
bindFactoryForChildFragment( ChildFragmentSubcomponent.Builder builder)141           abstract AndroidInjector.Factory<?> bindFactoryForChildFragment(
142               ChildFragmentSubcomponent.Builder builder);
143         }
144 
145         @Subcomponent.Builder
146         abstract class Builder extends AndroidInjector.Builder<TestParentFragment> {}
147 
148         @Subcomponent(modules = ChildFragmentSubcomponent.ChildFragmentModule.class)
149         interface ChildFragmentSubcomponent extends AndroidInjector<TestChildFragment> {
150           @Module
151           abstract class ChildFragmentModule {
152             @Provides
153             @IntoSet
addToComponentHierarchy()154             static Class<?> addToComponentHierarchy() {
155               return ChildFragmentSubcomponent.class;
156             }
157           }
158 
159           @Subcomponent.Builder
160           abstract class Builder extends AndroidInjector.Builder<TestChildFragment> {}
161         }
162       }
163 
164       @Subcomponent(modules = DialogFragmentSubcomponent.DialogFragmentModule.class)
165       interface DialogFragmentSubcomponent extends AndroidInjector<TestDialogFragment> {
166         @Module
167         abstract class DialogFragmentModule {
168           @Provides
169           @IntoSet
addToComponentHierarchy()170           static Class<?> addToComponentHierarchy() {
171             return DialogFragmentSubcomponent.class;
172           }
173         }
174 
175         @Subcomponent.Builder
176         abstract class Builder extends AndroidInjector.Builder<TestDialogFragment> {}
177       }
178     }
179 
180     @Subcomponent(modules = InnerActivityModule.class)
181     interface InnerActivitySubcomponent extends AndroidInjector<OuterClass.TestInnerClassActivity> {
182       @Subcomponent.Builder
183       abstract class Builder extends AndroidInjector.Builder<OuterClass.TestInnerClassActivity> {}
184 
185       @Module
186       abstract class InnerActivityModule {
187         @Provides
188         @IntoSet
addToComponentHierarchy()189         static Class<?> addToComponentHierarchy() {
190           return InnerActivitySubcomponent.class;
191         }
192       }
193     }
194 
195     @Subcomponent(modules = ServiceModule.class)
196     interface ServiceSubcomponent extends AndroidInjector<TestService> {
197       @Subcomponent.Builder
198       abstract class Builder extends AndroidInjector.Builder<TestService> {}
199 
200       @Module
201       abstract class ServiceModule {
202         @Provides
203         @IntoSet
addToComponentHierarchy()204         static Class<?> addToComponentHierarchy() {
205           return ServiceSubcomponent.class;
206         }
207       }
208     }
209 
210     @Subcomponent(modules = IntentServiceModule.class)
211     interface IntentServiceSubcomponent extends AndroidInjector<TestIntentService> {
212       @Subcomponent.Builder
213       abstract class Builder extends AndroidInjector.Builder<TestIntentService> {}
214 
215       @Module
216       abstract class IntentServiceModule {
217         @Provides
218         @IntoSet
addToComponentHierarchy()219         static Class<?> addToComponentHierarchy() {
220           return IntentServiceSubcomponent.class;
221         }
222       }
223     }
224 
225     @Subcomponent(modules = BroadcastReceiverModule.class)
226     interface BroadcastReceiverSubcomponent extends AndroidInjector<TestBroadcastReceiver> {
227       @Subcomponent.Builder
228       abstract class Builder extends AndroidInjector.Builder<TestBroadcastReceiver> {}
229 
230       @Module
231       abstract class BroadcastReceiverModule {
232         @Provides
233         @IntoSet
addToComponentHierarchy()234         static Class<?> addToComponentHierarchy() {
235           return BroadcastReceiverSubcomponent.class;
236         }
237       }
238     }
239 
240     @Subcomponent(modules = ContentProviderModule.class)
241     interface ContentProviderSubcomponent extends AndroidInjector<TestContentProvider> {
242       @Subcomponent.Builder
243       abstract class Builder extends AndroidInjector.Builder<TestContentProvider> {}
244 
245       @Module
246       abstract class ContentProviderModule {
247         @Provides
248         @IntoSet
addToComponentHierarchy()249         static Class<?> addToComponentHierarchy() {
250           return ContentProviderSubcomponent.class;
251         }
252       }
253     }
254   }
255 }
256