From f81a19a0825ec4dba13e1d6662129e8abac406d3 Mon Sep 17 00:00:00 2001 From: Manuel del Olmo Pomares Date: Sun, 15 Jan 2017 14:11:53 +0100 Subject: [PATCH] General revamp of Dagger usage - Use of Builders+Dagger 2.7 way to define sub-components - Abstraction layer between injections and Dagger framework --- app/build.gradle | 12 +- .../activities/MainActivity.java | 252 +++++++++--------- .../activities/MainActivityComponent.java | 38 +-- .../activities/MainActivityComponentProd.java | 38 +++ .../activities/MainActivityModule.java | 10 +- .../activities/Section.java | 10 + .../di/ComponentProxy.java | 25 ++ .../di/ComponentProxyProd.java | 84 ++++++ .../di/components/AppComponent.java | 32 +-- ...mponentMain.java => AppComponentProd.java} | 24 +- .../di/components/SectionComponent.java | 23 ++ .../di/injectableelements/base/App.java | 24 +- .../base/BaseInjectionActivity.java | 12 +- .../di/modules/ActivityModule.java | 6 - .../di/modules/AppModule.java | 13 +- .../fragments/MainFragment.java | 18 +- .../fragments/MainFragmentComponent.java | 7 + .../testsection/TestSectionModule.java | 15 +- .../testsection/firststep/FirstFragment.java | 31 +-- .../firststep/FirstFragmentComponent.java | 11 +- .../secondstep/SecondFragment.java | 18 +- .../secondstep/SecondFragmentComponent.java | 11 +- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 20 +- 24 files changed, 400 insertions(+), 336 deletions(-) mode change 100755 => 100644 app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityComponent.java create mode 100755 app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityComponentProd.java create mode 100644 app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/Section.java create mode 100644 app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/ComponentProxy.java create mode 100644 app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/ComponentProxyProd.java mode change 100755 => 100644 app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/AppComponent.java rename app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/{SectionComponentMain.java => AppComponentProd.java} (50%) create mode 100644 app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/SectionComponent.java diff --git a/app/build.gradle b/app/build.gradle index aca8d44..b31e3a2 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,13 +28,13 @@ buildscript { android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion 25 + buildToolsVersion "25.0.2" defaultConfig { applicationId "me.martinez.sergio.daggertwobasearchitecture" minSdkVersion 15 - targetSdkVersion 21 + targetSdkVersion 25 versionCode 1 versionName "1.0" } @@ -48,8 +48,8 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:22.2.0' - apt 'com.google.dagger:dagger-compiler:2.0' - compile 'com.google.dagger:dagger:2.0' + compile 'com.android.support:appcompat-v7:25.1.0' + compile 'com.google.dagger:dagger:2.7' + apt 'com.google.dagger:dagger-compiler:2.7' provided 'org.glassfish:javax.annotation:10.0-b28' } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivity.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivity.java index 613ad2a..138d18a 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivity.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivity.java @@ -23,12 +23,15 @@ import android.view.MenuItem; import android.view.View; import android.widget.Button; + import java.util.List; + import javax.inject.Inject; -import me.martinez.sergio.daggertwobasearchitecture.di.components.DaggerSectionComponentMain; + +import me.martinez.sergio.daggertwobasearchitecture.di.components.SectionComponent; +import me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base.App; import me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base.BaseFragment; import me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base.BaseInjectionActivity; -import me.martinez.sergio.daggertwobasearchitecture.di.modules.ActivityModule; import me.martinez.sergio.daggertwobasearchitecture.fragments.MainFragment; import me.martinez.sergio.daggertwobasearchitecture.R; import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep.FirstFragment; @@ -38,149 +41,146 @@ import me.martinez.sergio.daggertwobasearchitecture.utils.Log4Me; public class MainActivity extends BaseInjectionActivity implements - View.OnClickListener { - - private Button buttonClearFragments; - private Button buttonAddFirstFragment; - private Button buttonAddSecondFragment; - - @Inject A a; - @Inject B b; - @Inject Log4Me logger; - @Inject List diInjectionHistory; - - private Object sectionComponent; - - @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - initButtons(); - initFragment(); - initOnClickListeners(); - testDI(); - } - - private void initButtons() { - buttonAddSecondFragment = (Button) findViewById(R.id.buttonAddFirstFragment); - buttonAddFirstFragment = (Button) findViewById(R.id.buttonAddSecondFragment); - buttonClearFragments = (Button) findViewById(R.id.buttonClearFragments); - } - - private void initOnClickListeners() { - buttonAddSecondFragment.setOnClickListener(this); - buttonAddFirstFragment.setOnClickListener(this); - buttonClearFragments.setOnClickListener(this); - } - - //region Init methods - private void initFragment() { - FragmentManager fragmentManager = getSupportFragmentManager(); - MainFragment mainFragment = new MainFragment(); - FragmentTransaction ft = fragmentManager.beginTransaction(); - ft.replace(R.id.fragmentContainer, mainFragment); - ft.commit(); - } - - private void addFragment(BaseFragment baseFragment) { - FragmentManager fragmentManager = getSupportFragmentManager(); - FragmentTransaction ft = fragmentManager.beginTransaction(); - ft.add(R.id.fragmentContainer, baseFragment). - addToBackStack(baseFragment.getClass().getSimpleName()).commit(); - } - - private void clearFragmentStack() { - FragmentManager fragmentManager = getSupportFragmentManager(); - fragmentManager.popBackStack(FirstFragment.class.getSimpleName(), FragmentManager.POP_BACK_STACK_INCLUSIVE); - } - - //endregion - - //region Android AutoGenerated methods - - @Override public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.menu_main, menu); - return true; - } - - @Override public boolean onOptionsItemSelected(MenuItem item) { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - - //noinspection SimplifiableIfStatement - if (id == R.id.action_settings) { - return true; + View.OnClickListener { + + private Button buttonClearFragments; + private Button buttonAddFirstFragment; + private Button buttonAddSecondFragment; + private SectionComponent sectionComponent; + + @Inject + A a; + @Inject + B b; + @Inject + Log4Me logger; + @Inject + List diInjectionHistory; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + initButtons(); + initFragment(); + initOnClickListeners(); + testDI(); } - return super.onOptionsItemSelected(item); - } + private void initButtons() { + buttonAddSecondFragment = (Button) findViewById(R.id.buttonAddFirstFragment); + buttonAddFirstFragment = (Button) findViewById(R.id.buttonAddSecondFragment); + buttonClearFragments = (Button) findViewById(R.id.buttonClearFragments); + } - //endregion + private void initOnClickListeners() { + buttonAddSecondFragment.setOnClickListener(this); + buttonAddFirstFragment.setOnClickListener(this); + buttonClearFragments.setOnClickListener(this); + } - //region Test DI stuff - private void testDI() { + //region Init methods + private void initFragment() { + FragmentManager fragmentManager = getSupportFragmentManager(); + MainFragment mainFragment = new MainFragment(); + FragmentTransaction ft = fragmentManager.beginTransaction(); + ft.replace(R.id.fragmentContainer, mainFragment); + ft.commit(); + } - diInjectionHistory.add(MainActivity.class.getName()); - diInjectionHistory.add(logger.toString()); - diInjectionHistory.add(a.toString()); - diInjectionHistory.add(b.toString()); + private void addFragment(BaseFragment baseFragment) { + FragmentManager fragmentManager = getSupportFragmentManager(); + FragmentTransaction ft = fragmentManager.beginTransaction(); + ft.add(R.id.fragmentContainer, baseFragment). + addToBackStack(baseFragment.getClass().getSimpleName()).commit(); + } - } - //endregion + private void clearFragmentStack() { + FragmentManager fragmentManager = getSupportFragmentManager(); + fragmentManager.popBackStack(FirstFragment.class.getSimpleName(), FragmentManager.POP_BACK_STACK_INCLUSIVE); + } - //region dependency injection Methods + //endregion - @Override protected void initDI() { - activityComponent = DaggerMainActivityComponent.builder().appComponent(getAppComponent()) - .activityModule(new ActivityModule(this)) - .mainActivityModule(new MainActivityModule(this)).build(); - activityComponent.injectActivity(this); - } + //region Android AutoGenerated methods - //region Section Stuff + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_main, menu); + return true; + } - private void initSectionComponent() { - sectionComponent = - DaggerSectionComponentMain.builder().mainActivityComponent(activityComponent).build(); - } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); - private void clearSectionComponent(){ - sectionComponent = null; - } + //noinspection SimplifiableIfStatement + if (id == R.id.action_settings) { + return true; + } - @Override - public Object getActivityComponent() { - if (sectionComponent!=null){ - return sectionComponent; - }else{ - return activityComponent; + return super.onOptionsItemSelected(item); } - } - //endregion + //endregion - //endregion + //region Test DI stuff + private void testDI() { - @Override public void onClick(View v) { - switch (v.getId()){ - case R.id.buttonAddFirstFragment: - initSectionComponent(); - addFragment(new FirstFragment()); - break; - case R.id.buttonAddSecondFragment: - addFragment(new SecondFragment()); - break; - case R.id.buttonClearFragments: - clearSectionComponent(); + diInjectionHistory.add(MainActivity.class.getName()); + diInjectionHistory.add(logger.toString()); + diInjectionHistory.add(a.toString()); + diInjectionHistory.add(b.toString()); + + } + //endregion + + //region dependency injection Methods + + @Override + protected MainActivityComponent initDI() { + MainActivityComponent activityComponent = ((App) getApplication()).getComponentProxy().getMainActivityComponent(this); + activityComponent.injectActivity(this); + return activityComponent; + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.buttonAddFirstFragment: + addSection(); + break; + case R.id.buttonAddSecondFragment: + addFragment(new SecondFragment()); + break; + case R.id.buttonClearFragments: + clearSection(); + break; + default: + break; + } + } + + private void clearSection() { clearFragmentStack(); - break; - default: - break; + sectionComponent = null; } - } + private void addSection() { + initSection(); + addFragment(new FirstFragment()); + } + private void initSection() { + sectionComponent = ((App)getApplication()).getComponentProxy().getSectionComponent(this); + } + + public SectionComponent getSectionComponent() { + return sectionComponent; + } } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityComponent.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityComponent.java old mode 100755 new mode 100644 index 3fabb40..5b2f4dc --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityComponent.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityComponent.java @@ -1,39 +1,5 @@ -/* - * Copyright (C) 2015 Sergio Martinez Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package me.martinez.sergio.daggertwobasearchitecture.activities; -import dagger.Component; -import java.util.List; -import me.martinez.sergio.daggertwobasearchitecture.di.components.AppComponent; -import me.martinez.sergio.daggertwobasearchitecture.di.modules.ActivityModule; -import me.martinez.sergio.daggertwobasearchitecture.di.anotations.scopes.PerActivity; -import me.martinez.sergio.daggertwobasearchitecture.fragments.MainFragment; -import me.martinez.sergio.daggertwobasearchitecture.test.A; -import me.martinez.sergio.daggertwobasearchitecture.utils.Log4Me; - -/** - * Created by Sergio Martinez Rodriguez - * Date 15/7/15. - */ -@PerActivity -@Component(dependencies = AppComponent.class, modules = {ActivityModule.class, MainActivityModule.class}) -public interface MainActivityComponent extends MainFragment.Pluser{ - void injectActivity(MainActivity mainActivity); - A provideA(); - List provideDiInjectionHistory(); - Log4Me provideLog4Me(); +public interface MainActivityComponent { + void injectActivity(MainActivity mainActivity); } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityComponentProd.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityComponentProd.java new file mode 100755 index 0000000..5bd22f8 --- /dev/null +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityComponentProd.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2015 Sergio Martinez Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.martinez.sergio.daggertwobasearchitecture.activities; + +import javax.inject.Provider; + +import dagger.Subcomponent; +import me.martinez.sergio.daggertwobasearchitecture.di.components.SectionComponent; +import me.martinez.sergio.daggertwobasearchitecture.di.modules.ActivityModule; +import me.martinez.sergio.daggertwobasearchitecture.di.anotations.scopes.PerActivity; +import me.martinez.sergio.daggertwobasearchitecture.fragments.MainFragmentComponent; + +@PerActivity +@Subcomponent(modules = {ActivityModule.class, MainActivityModule.class}) +public interface MainActivityComponentProd extends MainActivityComponent { + Provider mainFragmentComponentBuilderProvider(); + Provider sectionComponentProdBuilderProvider(); + @Subcomponent.Builder + interface Builder { + Builder mainActivityComponentProd(MainActivityModule mainActivityModule); + Builder activityModule(ActivityModule activityModule); + MainActivityComponentProd build(); + } +} diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityModule.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityModule.java index cfda5c7..d9b35e3 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityModule.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/MainActivityModule.java @@ -17,15 +17,13 @@ package me.martinez.sergio.daggertwobasearchitecture.activities; import dagger.Module; +import me.martinez.sergio.daggertwobasearchitecture.di.components.SectionComponent; +import me.martinez.sergio.daggertwobasearchitecture.fragments.MainFragmentComponent; -/** - * Created by Sergio Martinez Rodriguez - * Date 15/7/15. - */ -@Module +@Module(subcomponents = {SectionComponent.class, MainFragmentComponent.class }) public class MainActivityModule{ - MainActivity mainActivity; + private MainActivity mainActivity; public MainActivityModule(MainActivity mainActivity) { this.mainActivity = mainActivity; diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/Section.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/Section.java new file mode 100644 index 0000000..cc42d2c --- /dev/null +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/activities/Section.java @@ -0,0 +1,10 @@ +package me.martinez.sergio.daggertwobasearchitecture.activities; + +public class Section { + + private String sectionName; + + public Section(String name) { + sectionName = name; + } +} diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/ComponentProxy.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/ComponentProxy.java new file mode 100644 index 0000000..023fc88 --- /dev/null +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/ComponentProxy.java @@ -0,0 +1,25 @@ +package me.martinez.sergio.daggertwobasearchitecture.di; + +import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivity; +import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivityComponent; +import me.martinez.sergio.daggertwobasearchitecture.di.components.AppComponent; +import me.martinez.sergio.daggertwobasearchitecture.di.components.SectionComponent; +import me.martinez.sergio.daggertwobasearchitecture.fragments.MainFragment; +import me.martinez.sergio.daggertwobasearchitecture.fragments.MainFragmentComponent; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep.FirstFragment; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep.FirstFragmentComponent; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.secondstep.SecondFragment; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.secondstep.SecondFragmentComponent; + +/** + * This interface sits between the dagger component implementations and its usages. This way, + * a certain injection is not coupled with the component-module hierarchy. + */ +public interface ComponentProxy { + AppComponent getAppComponent(); + MainActivityComponent getMainActivityComponent(MainActivity mainActivity); + MainFragmentComponent getMainFragmentComponent(MainActivity activity, MainFragment fragment); + FirstFragmentComponent getFirstFragmentComponent(MainActivity mainActivity, FirstFragment fragment); + SecondFragmentComponent getSecondFragmentComponent(MainActivity mainActivity, SecondFragment fragment); + SectionComponent getSectionComponent(MainActivity mainActivity); +} diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/ComponentProxyProd.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/ComponentProxyProd.java new file mode 100644 index 0000000..ab035f1 --- /dev/null +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/ComponentProxyProd.java @@ -0,0 +1,84 @@ +package me.martinez.sergio.daggertwobasearchitecture.di; + +import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivity; +import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivityComponent; +import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivityComponentProd; +import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivityModule; +import me.martinez.sergio.daggertwobasearchitecture.di.components.AppComponent; +import me.martinez.sergio.daggertwobasearchitecture.di.components.AppComponentProd; +import me.martinez.sergio.daggertwobasearchitecture.di.components.DaggerAppComponentProd; +import me.martinez.sergio.daggertwobasearchitecture.di.components.SectionComponent; +import me.martinez.sergio.daggertwobasearchitecture.di.modules.ActivityModule; +import me.martinez.sergio.daggertwobasearchitecture.di.modules.FragmentModule; +import me.martinez.sergio.daggertwobasearchitecture.fragments.MainFragment; +import me.martinez.sergio.daggertwobasearchitecture.fragments.MainFragmentComponent; +import me.martinez.sergio.daggertwobasearchitecture.fragments.MainFragmentModule; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.TestSectionModule; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep.FirstFragment; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep.FirstFragmentComponent; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep.FirstFragmentModule; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.secondstep.SecondFragment; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.secondstep.SecondFragmentComponent; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.secondstep.SecondFragmentModule; + +public class ComponentProxyProd implements ComponentProxy { + private static ComponentProxy ourInstance = new ComponentProxyProd(); + + public static ComponentProxy getInstance() { + return ourInstance; + } + + private AppComponentProd appComponent; + + private ComponentProxyProd() { + appComponent = DaggerAppComponentProd.create(); + } + + @Override + public AppComponent getAppComponent() { + return appComponent; + } + + @Override + public MainActivityComponent getMainActivityComponent(MainActivity mainActivity) { + return appComponent.mainActivityComponentProdBuilderProvider().get() + .mainActivityComponentProd(new MainActivityModule(mainActivity)) + .activityModule(new ActivityModule(mainActivity)) + .build(); + } + + @Override + public MainFragmentComponent getMainFragmentComponent(MainActivity activity, MainFragment fragment) { + MainActivityComponentProd component = (MainActivityComponentProd) activity.getActivityComponent(); + return component.mainFragmentComponentBuilderProvider().get() + .mainFragmentComponent(new MainFragmentModule(fragment)) + .fragmentModule(new FragmentModule(fragment)) + .build(); + } + + @Override + public FirstFragmentComponent getFirstFragmentComponent(MainActivity activity, FirstFragment fragment) { + SectionComponent sectionComponent = activity.getSectionComponent(); + return sectionComponent.firstFragmentComponentBuilder().get() + .firstFragmentComponent(new FirstFragmentModule(fragment)) + .fragmentModule(new FragmentModule(fragment)) + .build(); + } + + @Override + public SecondFragmentComponent getSecondFragmentComponent(MainActivity activity, SecondFragment fragment) { + SectionComponent sectionComponent = activity.getSectionComponent(); + return sectionComponent.secondFragmentComponentBuilder().get() + .secondFragmentComponent(new SecondFragmentModule(fragment)) + .fragmentModule(new FragmentModule(fragment)) + .build(); + } + + @Override + public SectionComponent getSectionComponent(MainActivity activity) { + MainActivityComponentProd component = (MainActivityComponentProd) activity.getActivityComponent(); + return component.sectionComponentProdBuilderProvider().get() + .sectionComponent(new TestSectionModule()) + .build(); + } +} diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/AppComponent.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/AppComponent.java old mode 100755 new mode 100644 index 5327ec4..c7c2f92 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/AppComponent.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/AppComponent.java @@ -1,37 +1,7 @@ -/* - * Copyright (C) 2015 Sergio Martinez Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package me.martinez.sergio.daggertwobasearchitecture.di.components; -import dagger.Component; -import java.util.List; -import javax.inject.Singleton; -import me.martinez.sergio.daggertwobasearchitecture.test.A; import me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base.App; -import me.martinez.sergio.daggertwobasearchitecture.di.modules.AppModule; -import me.martinez.sergio.daggertwobasearchitecture.utils.Log4Me; -/** - * Created by Sergio Martinez Rodriguez - * Date 15/7/15. - */ -@Singleton @Component(modules = AppModule.class) public interface AppComponent { - void inject(App app); - A provideA(); - List provideDiInjectionHistory(); - Log4Me provideLog4Me(); + void inject(App app); } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/SectionComponentMain.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/AppComponentProd.java similarity index 50% rename from app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/SectionComponentMain.java rename to app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/AppComponentProd.java index 63006ad..76c56d6 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/SectionComponentMain.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/AppComponentProd.java @@ -16,22 +16,16 @@ package me.martinez.sergio.daggertwobasearchitecture.di.components; -/** - * Created by Sergio Martinez Rodriguez - * Date 15/7/15. - */ +import javax.inject.Provider; +import javax.inject.Singleton; import dagger.Component; -import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivityComponent; -import me.martinez.sergio.daggertwobasearchitecture.di.anotations.scopes.PerSection; -import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.TestSectionModule; -import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep.FirstFragment; -import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.secondstep.SecondFragment; -import me.martinez.sergio.daggertwobasearchitecture.test.SectionProperty; +import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivityComponentProd; +import me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base.App; +import me.martinez.sergio.daggertwobasearchitecture.di.modules.AppModule; -@PerSection -@Component( dependencies = MainActivityComponent.class, modules = TestSectionModule.class) -public interface SectionComponentMain extends - FirstFragment.Pluser, - SecondFragment.Pluser{ +@Singleton +@Component(modules = AppModule.class) +public interface AppComponentProd extends AppComponent { + Provider mainActivityComponentProdBuilderProvider(); } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/SectionComponent.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/SectionComponent.java new file mode 100644 index 0000000..1230089 --- /dev/null +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/components/SectionComponent.java @@ -0,0 +1,23 @@ +package me.martinez.sergio.daggertwobasearchitecture.di.components; + +import javax.inject.Provider; + +import dagger.Provides; +import dagger.Subcomponent; +import me.martinez.sergio.daggertwobasearchitecture.di.anotations.scopes.PerSection; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.TestSectionModule; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep.FirstFragmentComponent; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.secondstep.SecondFragmentComponent; + +@PerSection +@Subcomponent(modules = TestSectionModule.class) +public interface SectionComponent { + Provider firstFragmentComponentBuilder(); + Provider secondFragmentComponentBuilder(); + + @Subcomponent.Builder + interface Builder { + Builder sectionComponent(TestSectionModule module); + SectionComponent build(); + } +} diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/injectableelements/base/App.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/injectableelements/base/App.java index 3095fe1..0f0a439 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/injectableelements/base/App.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/injectableelements/base/App.java @@ -17,12 +17,11 @@ package me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base; import android.app.Application; -import android.util.Log; -import java.util.HashMap; import java.util.List; import javax.inject.Inject; -import me.martinez.sergio.daggertwobasearchitecture.di.components.AppComponent; -import me.martinez.sergio.daggertwobasearchitecture.di.components.DaggerAppComponent; + +import me.martinez.sergio.daggertwobasearchitecture.di.ComponentProxy; +import me.martinez.sergio.daggertwobasearchitecture.di.ComponentProxyProd; import me.martinez.sergio.daggertwobasearchitecture.test.A; import me.martinez.sergio.daggertwobasearchitecture.utils.Log4Me; @@ -36,8 +35,6 @@ public class App extends Application { @Inject Log4Me logger; @Inject List diContainer; - private AppComponent appComponent; - @Override public void onCreate() { super.onCreate(); @@ -47,14 +44,11 @@ public class App extends Application { } private void initDI() { - appComponent = DaggerAppComponent.create(); - - /** DaggerAppComponent.create() is equivalent to : - * DaggerAppComponent.builder().appModule(new AppModule()).build() - * when module has not arguments - **/ + getComponentProxy().getAppComponent().inject(this); + } - appComponent.inject(this); + public ComponentProxy getComponentProxy() { + return ComponentProxyProd.getInstance(); } private void testDI() { @@ -71,8 +65,4 @@ private void testDI() { } } - - public AppComponent getAppComponent() { - return appComponent; - } } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/injectableelements/base/BaseInjectionActivity.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/injectableelements/base/BaseInjectionActivity.java index 3fddf42..3c3d745 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/injectableelements/base/BaseInjectionActivity.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/injectableelements/base/BaseInjectionActivity.java @@ -18,7 +18,6 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import me.martinez.sergio.daggertwobasearchitecture.di.components.AppComponent; /** * Created by Sergio Martinez Rodriguez @@ -30,17 +29,12 @@ public abstract class BaseInjectionActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - initDI(); + activityComponent = initDI(); } - protected abstract void initDI(); + protected abstract T initDI(); - public AppComponent getAppComponent() { - AppComponent appComponent = ((App) getApplication()).getAppComponent(); - return appComponent; - } - - public Object getActivityComponent() { + public T getActivityComponent() { return activityComponent; } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/modules/ActivityModule.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/modules/ActivityModule.java index 82bf4d8..41a28b1 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/modules/ActivityModule.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/modules/ActivityModule.java @@ -19,15 +19,9 @@ import dagger.Module; import dagger.Provides; import me.martinez.sergio.daggertwobasearchitecture.di.anotations.scopes.PerActivity; -import me.martinez.sergio.daggertwobasearchitecture.di.anotations.scopes.PerSection; import me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base.BaseInjectionActivity; import me.martinez.sergio.daggertwobasearchitecture.test.B; -import me.martinez.sergio.daggertwobasearchitecture.test.SectionProperty; -/** - * Created by Sergio Martinez Rodriguez - * Date 15/7/15. - */ @Module public class ActivityModule { diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/modules/AppModule.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/modules/AppModule.java index e50ea66..46c0af9 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/modules/AppModule.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/di/modules/AppModule.java @@ -18,19 +18,18 @@ import dagger.Module; import dagger.Provides; +import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivityComponentProd; + import java.util.ArrayList; import java.util.List; import javax.inject.Singleton; -/** - * Created by Sergio Martinez Rodriguez - * Date 15/7/15. - */ -@Module(includes = IncludedModule.class) +@Module(includes = IncludedModule.class, subcomponents = MainActivityComponentProd.class) public class AppModule { - @Singleton @Provides List provideDiInjectionHistory(){ + @Singleton + @Provides + List provideDiInjectionHistory(){ return new ArrayList<>(); } - } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/MainFragment.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/MainFragment.java index 1d51431..db29428 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/MainFragment.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/MainFragment.java @@ -17,20 +17,21 @@ package me.martinez.sergio.daggertwobasearchitecture.fragments; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; + import java.util.List; + import javax.inject.Inject; + import me.martinez.sergio.daggertwobasearchitecture.R; -import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivityComponent; +import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivity; +import me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base.App; import me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base.BaseFragment; -import me.martinez.sergio.daggertwobasearchitecture.di.modules.FragmentModule; import me.martinez.sergio.daggertwobasearchitecture.test.A; import me.martinez.sergio.daggertwobasearchitecture.test.B; import me.martinez.sergio.daggertwobasearchitecture.test.C; -import me.martinez.sergio.daggertwobasearchitecture.test.D; /** * Created by Sergio Martinez Rodriguez @@ -60,15 +61,8 @@ private void testDI() { diInjectioHistoric.add(c.toString()); } - //region dependency injection Methods @Override protected void initDIComponent() { - fragmentComponent = (getParentComponent(MainActivityComponent.class)).plus( - new FragmentModule(this), new MainFragmentModule(this)); + fragmentComponent = ((App) getActivity().getApplication()).getComponentProxy().getMainFragmentComponent((MainActivity) getActivity(), this); fragmentComponent.injectFragment(this); } - - public interface Pluser{ - MainFragmentComponent plus(FragmentModule secondFragmentModule, MainFragmentModule baseFragmentModule); - } - //endregion } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/MainFragmentComponent.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/MainFragmentComponent.java index b34a6b0..d6e0629 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/MainFragmentComponent.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/MainFragmentComponent.java @@ -22,6 +22,7 @@ */ import dagger.Subcomponent; +import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivityModule; import me.martinez.sergio.daggertwobasearchitecture.di.anotations.scopes.PerFragment; import me.martinez.sergio.daggertwobasearchitecture.di.modules.FragmentModule; import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep.FirstFragment; @@ -33,4 +34,10 @@ @Subcomponent( modules = {FragmentModule.class, MainFragmentModule.class}) public interface MainFragmentComponent{ void injectFragment(MainFragment mainFragment); + @Subcomponent.Builder + interface Builder { + Builder mainFragmentComponent(MainFragmentModule mainFragmentModule); + Builder fragmentModule(FragmentModule fragmentModule); + MainFragmentComponent build(); + } } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/TestSectionModule.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/TestSectionModule.java index 8f716e3..e69f6ec 100644 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/TestSectionModule.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/TestSectionModule.java @@ -18,23 +18,22 @@ import dagger.Module; import dagger.Provides; -import javax.inject.Singleton; import me.martinez.sergio.daggertwobasearchitecture.di.anotations.scopes.PerSection; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep.FirstFragmentComponent; +import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.secondstep.SecondFragmentComponent; import me.martinez.sergio.daggertwobasearchitecture.test.NotScopedProperty; import me.martinez.sergio.daggertwobasearchitecture.test.SectionProperty; -/** - * Created by Sergio Martinez Rodriguez - * Date 16/7/15. - */ -@Module +@Module(subcomponents = {FirstFragmentComponent.class, SecondFragmentComponent.class}) public class TestSectionModule{ - @PerSection @Provides public SectionProperty provideSectionProperty(){ + @PerSection @Provides + SectionProperty provideSectionProperty(){ return new SectionProperty(); } - @Provides public NotScopedProperty provideNotScopedProperty(){ + @Provides + NotScopedProperty provideNotScopedProperty(){ return new NotScopedProperty(); } } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/firststep/FirstFragment.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/firststep/FirstFragment.java index a584239..01c231f 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/firststep/FirstFragment.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/firststep/FirstFragment.java @@ -17,17 +17,19 @@ package me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; + import java.util.List; + import javax.inject.Inject; + import me.martinez.sergio.daggertwobasearchitecture.R; -import me.martinez.sergio.daggertwobasearchitecture.di.anotations.scopes.PerSection; -import me.martinez.sergio.daggertwobasearchitecture.di.components.SectionComponentMain; +import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivity; +import me.martinez.sergio.daggertwobasearchitecture.activities.Section; +import me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base.App; import me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base.BaseFragment; -import me.martinez.sergio.daggertwobasearchitecture.di.modules.FragmentModule; import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep.presentation.FirstFragmentPresenter; import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep.presentation.FirstFragmentView; import me.martinez.sergio.daggertwobasearchitecture.test.A; @@ -43,13 +45,13 @@ public class FirstFragment extends BaseFragment implements FirstFragmentView { - @Inject A a; - @Inject E e; - @Inject D d; - @Inject List diInjectionHistory; - @Inject FirstFragmentPresenter firstFragmentPresenter; - @Inject SectionProperty sectionProperty; - @Inject NotScopedProperty notScopedProperty; + @Inject A a; + @Inject E e; + @Inject D d; + @Inject List diInjectionHistory; + @Inject FirstFragmentPresenter firstFragmentPresenter; + @Inject SectionProperty sectionProperty; + @Inject NotScopedProperty notScopedProperty; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -75,13 +77,8 @@ private void testDI() { } @Override protected void initDIComponent() { - fragmentComponent = (getParentComponent(SectionComponentMain.class)).plus( - new FragmentModule(this), new FirstFragmentModule(this)); + fragmentComponent = ((App) getActivity().getApplication()).getComponentProxy().getFirstFragmentComponent((MainActivity) getActivity(), this); fragmentComponent.injectFragment(this); } - public interface Pluser{ - FirstFragmentComponent plus(FragmentModule fragmentModule, FirstFragmentModule firstFragmentModule); - } - } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/firststep/FirstFragmentComponent.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/firststep/FirstFragmentComponent.java index e2c1c4a..5ce6bb1 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/firststep/FirstFragmentComponent.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/firststep/FirstFragmentComponent.java @@ -16,11 +16,6 @@ package me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.firststep; -/** - * Created by Sergio Martinez Rodriguez - * Date 15/7/15. - */ - import dagger.Subcomponent; import me.martinez.sergio.daggertwobasearchitecture.di.anotations.scopes.PerFragment; import me.martinez.sergio.daggertwobasearchitecture.di.modules.FragmentModule; @@ -29,4 +24,10 @@ @Subcomponent( modules = {FragmentModule.class, FirstFragmentModule.class}) public interface FirstFragmentComponent { void injectFragment(FirstFragment firstFragment); + @Subcomponent.Builder + interface Builder { + Builder firstFragmentComponent(FirstFragmentModule firstFragmentModule); + Builder fragmentModule(FragmentModule fragmentModule); + FirstFragmentComponent build(); + } } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/secondstep/SecondFragment.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/secondstep/SecondFragment.java index b491484..31ea38b 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/secondstep/SecondFragment.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/secondstep/SecondFragment.java @@ -17,16 +17,19 @@ package me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.secondstep; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; + import java.util.List; + import javax.inject.Inject; + import me.martinez.sergio.daggertwobasearchitecture.R; -import me.martinez.sergio.daggertwobasearchitecture.di.components.SectionComponentMain; +import me.martinez.sergio.daggertwobasearchitecture.activities.MainActivity; +import me.martinez.sergio.daggertwobasearchitecture.activities.Section; +import me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base.App; import me.martinez.sergio.daggertwobasearchitecture.di.injectableelements.base.BaseFragment; -import me.martinez.sergio.daggertwobasearchitecture.di.modules.FragmentModule; import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.secondstep.presentation.SecondFragmentPresenter; import me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.secondstep.presentation.SecondFragmentView; import me.martinez.sergio.daggertwobasearchitecture.test.D; @@ -72,18 +75,11 @@ private void testDI() { diInjectionHistory.add(d.toString()); logger.log(diInjectionHistory.toString()); - - } @Override protected void initDIComponent() { - fragmentComponent = (getParentComponent(SectionComponentMain.class)).plus( - new FragmentModule(this), new SecondFragmentModule(this)); + fragmentComponent = ((App) getActivity().getApplication()).getComponentProxy().getSecondFragmentComponent((MainActivity) getActivity(), this); fragmentComponent.injectFragment(this); } - public interface Pluser{ - SecondFragmentComponent plus(FragmentModule secondFragmentModule, SecondFragmentModule firstFragmentModule); - } - } diff --git a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/secondstep/SecondFragmentComponent.java b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/secondstep/SecondFragmentComponent.java index 691caaf..6b75cc2 100755 --- a/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/secondstep/SecondFragmentComponent.java +++ b/app/src/main/java/me/martinez/sergio/daggertwobasearchitecture/fragments/sections/testsection/secondstep/SecondFragmentComponent.java @@ -16,11 +16,6 @@ package me.martinez.sergio.daggertwobasearchitecture.fragments.sections.testsection.secondstep; -/** - * Created by Sergio Martinez Rodriguez - * Date 15/7/15. - */ - import dagger.Subcomponent; import me.martinez.sergio.daggertwobasearchitecture.di.anotations.scopes.PerFragment; import me.martinez.sergio.daggertwobasearchitecture.di.modules.FragmentModule; @@ -29,4 +24,10 @@ @Subcomponent( modules = {FragmentModule.class, SecondFragmentModule.class}) public interface SecondFragmentComponent { void injectFragment(SecondFragment secondFragment); + @Subcomponent.Builder + interface Builder { + Builder secondFragmentComponent(SecondFragmentModule secondFragmentModule); + Builder fragmentModule(FragmentModule fragmentModule); + SecondFragmentComponent build(); + } } diff --git a/build.gradle b/build.gradle index f69a60d..67a4910 100755 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.2.3' + classpath 'com.android.tools.build:gradle:2.2.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 19f7f38..ef2a334 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,22 +1,6 @@ -# -# Copyright (C) 2015 Sergio Martinez Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -#Wed Apr 10 15:27:10 PDT 2013 +#Thu Jan 12 22:08:51 CET 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip