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