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.AllControllersAreDirectChildrenOfApplication.ApplicationComponent.BroadcastReceiverSubcomponent.BroadcastReceiverModule; 28 import dagger.android.support.functional.AllControllersAreDirectChildrenOfApplication.ApplicationComponent.ContentProviderSubcomponent.ContentProviderModule; 29 import dagger.android.support.functional.AllControllersAreDirectChildrenOfApplication.ApplicationComponent.InnerActivitySubcomponent.InnerActivityModule; 30 import dagger.android.support.functional.AllControllersAreDirectChildrenOfApplication.ApplicationComponent.IntentServiceSubcomponent.IntentServiceModule; 31 import dagger.android.support.functional.AllControllersAreDirectChildrenOfApplication.ApplicationComponent.ServiceSubcomponent.ServiceModule; 32 import dagger.multibindings.ClassKey; 33 import dagger.multibindings.IntoMap; 34 import dagger.multibindings.IntoSet; 35 36 public final class AllControllersAreDirectChildrenOfApplication extends DaggerApplication { 37 38 @Override applicationInjector()39 protected AndroidInjector<AllControllersAreDirectChildrenOfApplication> applicationInjector() { 40 return DaggerAllControllersAreDirectChildrenOfApplication_ApplicationComponent.create(); 41 } 42 43 @Component(modules = {ApplicationComponent.ApplicationModule.class, AndroidInjectionModule.class}) 44 interface ApplicationComponent 45 extends AndroidInjector<AllControllersAreDirectChildrenOfApplication> { 46 @Module( 47 subcomponents = { 48 ActivitySubcomponent.class, 49 InnerActivitySubcomponent.class, 50 ParentFragmentSubcomponent.class, 51 ChildFragmentSubcomponent.class, 52 DialogFragmentSubcomponent.class, 53 ServiceSubcomponent.class, 54 IntentServiceSubcomponent.class, 55 BroadcastReceiverSubcomponent.class, 56 ContentProviderSubcomponent.class 57 } 58 ) 59 abstract class ApplicationModule { 60 @Provides 61 @IntoSet addToComponentHierarchy()62 static Class<?> addToComponentHierarchy() { 63 return ApplicationComponent.class; 64 } 65 66 @Binds 67 @IntoMap 68 @ClassKey(TestActivity.class) bindFactoryForTestActivity( ActivitySubcomponent.Builder builder)69 abstract AndroidInjector.Factory<?> bindFactoryForTestActivity( 70 ActivitySubcomponent.Builder builder); 71 72 @Binds 73 @IntoMap 74 @ClassKey(OuterClass.TestInnerClassActivity.class) bindFactoryForInnerActivity( InnerActivitySubcomponent.Builder builder)75 abstract AndroidInjector.Factory<?> bindFactoryForInnerActivity( 76 InnerActivitySubcomponent.Builder builder); 77 78 @Binds 79 @IntoMap 80 @ClassKey(TestParentFragment.class) bindFactoryForParentFragment( ParentFragmentSubcomponent.Builder builder)81 abstract AndroidInjector.Factory<?> bindFactoryForParentFragment( 82 ParentFragmentSubcomponent.Builder builder); 83 84 @Binds 85 @IntoMap 86 @ClassKey(TestChildFragment.class) bindFactoryForChildFragment( ChildFragmentSubcomponent.Builder builder)87 abstract AndroidInjector.Factory<?> bindFactoryForChildFragment( 88 ChildFragmentSubcomponent.Builder builder); 89 90 @Binds 91 @IntoMap 92 @ClassKey(TestDialogFragment.class) bindFactoryForDialogFragment( DialogFragmentSubcomponent.Builder builder)93 abstract AndroidInjector.Factory<?> bindFactoryForDialogFragment( 94 DialogFragmentSubcomponent.Builder builder); 95 96 @Binds 97 @IntoMap 98 @ClassKey(TestService.class) bindFactoryForService( ServiceSubcomponent.Builder builder)99 abstract AndroidInjector.Factory<?> bindFactoryForService( 100 ServiceSubcomponent.Builder builder); 101 102 @Binds 103 @IntoMap 104 @ClassKey(TestIntentService.class) bindFactoryForIntentService( IntentServiceSubcomponent.Builder builder)105 abstract AndroidInjector.Factory<?> bindFactoryForIntentService( 106 IntentServiceSubcomponent.Builder builder); 107 108 @Binds 109 @IntoMap 110 @ClassKey(TestBroadcastReceiver.class) bindFactoryForBroadcastReceiver( BroadcastReceiverSubcomponent.Builder builder)111 abstract AndroidInjector.Factory<?> bindFactoryForBroadcastReceiver( 112 BroadcastReceiverSubcomponent.Builder builder); 113 114 @Binds 115 @IntoMap 116 @ClassKey(TestContentProvider.class) bindFactoryForContentProvider( ContentProviderSubcomponent.Builder builder)117 abstract AndroidInjector.Factory<?> bindFactoryForContentProvider( 118 ContentProviderSubcomponent.Builder builder); 119 } 120 121 @Subcomponent(modules = ActivitySubcomponent.ActivityModule.class) 122 interface ActivitySubcomponent extends AndroidInjector<TestActivity> { 123 @Module 124 abstract class ActivityModule { 125 @Provides 126 @IntoSet addToComponentHierarchy()127 static Class<?> addToComponentHierarchy() { 128 return ActivitySubcomponent.class; 129 } 130 } 131 132 @Subcomponent.Builder 133 abstract class Builder extends AndroidInjector.Builder<TestActivity> {} 134 } 135 136 @Subcomponent(modules = InnerActivityModule.class) 137 interface InnerActivitySubcomponent extends AndroidInjector<OuterClass.TestInnerClassActivity> { 138 @Subcomponent.Builder 139 abstract class Builder extends AndroidInjector.Builder<OuterClass.TestInnerClassActivity> {} 140 141 @Module 142 abstract class InnerActivityModule { 143 @Provides 144 @IntoSet addToComponentHierarchy()145 static Class<?> addToComponentHierarchy() { 146 return InnerActivitySubcomponent.class; 147 } 148 } 149 } 150 151 @Subcomponent(modules = ParentFragmentSubcomponent.ParentFragmentModule.class) 152 interface ParentFragmentSubcomponent extends AndroidInjector<TestParentFragment> { 153 @Module 154 abstract class ParentFragmentModule { 155 @Provides 156 @IntoSet addToComponentHierarchy()157 static Class<?> addToComponentHierarchy() { 158 return ParentFragmentSubcomponent.class; 159 } 160 } 161 162 @Subcomponent.Builder 163 abstract class Builder extends AndroidInjector.Builder<TestParentFragment> {} 164 } 165 166 @Subcomponent(modules = ChildFragmentSubcomponent.ChildFragmentModule.class) 167 interface ChildFragmentSubcomponent extends AndroidInjector<TestChildFragment> { 168 @Module 169 abstract class ChildFragmentModule { 170 @Provides 171 @IntoSet addToComponentHierarchy()172 static Class<?> addToComponentHierarchy() { 173 return ChildFragmentSubcomponent.class; 174 } 175 } 176 177 @Subcomponent.Builder 178 abstract class Builder extends AndroidInjector.Builder<TestChildFragment> {} 179 } 180 181 @Subcomponent(modules = DialogFragmentSubcomponent.DialogFragmentModule.class) 182 interface DialogFragmentSubcomponent extends AndroidInjector<TestDialogFragment> { 183 @Module 184 abstract class DialogFragmentModule { 185 @Provides 186 @IntoSet addToComponentHierarchy()187 static Class<?> addToComponentHierarchy() { 188 return DialogFragmentSubcomponent.class; 189 } 190 } 191 192 @Subcomponent.Builder 193 abstract class Builder extends AndroidInjector.Builder<TestDialogFragment> {} 194 } 195 196 @Subcomponent(modules = ServiceModule.class) 197 interface ServiceSubcomponent extends AndroidInjector<TestService> { 198 @Subcomponent.Builder 199 abstract class Builder extends AndroidInjector.Builder<TestService> {} 200 201 @Module 202 abstract class ServiceModule { 203 @Provides 204 @IntoSet addToComponentHierarchy()205 static Class<?> addToComponentHierarchy() { 206 return ServiceSubcomponent.class; 207 } 208 } 209 } 210 211 @Subcomponent(modules = IntentServiceModule.class) 212 interface IntentServiceSubcomponent extends AndroidInjector<TestIntentService> { 213 @Subcomponent.Builder 214 abstract class Builder extends AndroidInjector.Builder<TestIntentService> {} 215 216 @Module 217 abstract class IntentServiceModule { 218 @Provides 219 @IntoSet addToComponentHierarchy()220 static Class<?> addToComponentHierarchy() { 221 return IntentServiceSubcomponent.class; 222 } 223 } 224 } 225 226 @Subcomponent(modules = BroadcastReceiverModule.class) 227 interface BroadcastReceiverSubcomponent extends AndroidInjector<TestBroadcastReceiver> { 228 @Subcomponent.Builder 229 abstract class Builder extends AndroidInjector.Builder<TestBroadcastReceiver> {} 230 231 @Module 232 abstract class BroadcastReceiverModule { 233 @Provides 234 @IntoSet addToComponentHierarchy()235 static Class<?> addToComponentHierarchy() { 236 return BroadcastReceiverSubcomponent.class; 237 } 238 } 239 } 240 241 @Subcomponent(modules = ContentProviderModule.class) 242 interface ContentProviderSubcomponent extends AndroidInjector<TestContentProvider> { 243 @Subcomponent.Builder 244 abstract class Builder extends AndroidInjector.Builder<TestContentProvider> {} 245 246 @Module 247 abstract class ContentProviderModule { 248 @Provides 249 @IntoSet addToComponentHierarchy()250 static Class<?> addToComponentHierarchy() { 251 return ContentProviderSubcomponent.class; 252 } 253 } 254 } 255 } 256 } 257